llvm/llvm-project

[InstCombine] Failure to factorize `add`/`sub` and `max`/`min` using distributivity

Open

#92,433 创建于 2024年5月16日

在 GitHub 查看
 (10 评论) (0 反应) (1 负责人)C++ (10,782 fork)batch import
good first issuellvm:instcombinemissed-optimization

仓库指标

Star
 (26,378 star)
PR 合并指标
 (平均合并 1天 2小时) (30 天内合并 1,000 个 PR)

描述

alive proof

use std::cmp::max;
use std::cmp::min;

// * `(a umin c) umax (b umin c) => (a umax b) umin c`
#[no_mangle]
pub fn src1(a: u32, b: u32, c: u32) -> u32 {
    max(min(a, c), min(b, c))
}
#[no_mangle]
pub fn tgt1(a: u32, b: u32, c: u32) -> u32 {
    min(max(a, b), c)
}

// * `(a umax c) umin (b umax c) => (a umin b) umax c`
#[no_mangle]
pub fn src2(a: u32, b: u32, c: u32) -> u32 {
    min(max(a, c), max(b, c))
}
#[no_mangle]
pub fn tgt2(a: u32, b: u32, c: u32) -> u32 {
    max(min(a, b), c)
}

// * `(a smin c) smax (b smin c) => (a smax b) smin c`
#[no_mangle]
pub fn src3(a: i32, b: i32, c: i32) -> i32 {
    max(min(a, c), min(b, c))
}
#[no_mangle]
pub fn tgt3(a: i32, b: i32, c: i32) -> i32 {
    min(max(a, b), c)
}

// * `(a smax c) smin (b smax c) => (a smin b) smax c`
#[no_mangle]
pub fn src4(a: i32, b: i32, c: i32) -> i32 {
    min(max(a, c), max(b, c))
}
#[no_mangle]
pub fn tgt4(a: i32, b: i32, c: i32) -> i32 {
    max(min(a, b), c)
}

// * `umax(a +usat b, a +usat c) => a +usat (b umax c)`
#[no_mangle]
pub fn src5(a: u32, b: u32, c: u32) -> u32 {
    max(a.saturating_add(b), a.saturating_add(c))
}
#[no_mangle]
pub fn tgt5(a: u32, b: u32, c: u32) -> u32 {
    a.saturating_add(max(b, c))
}

// * `umax(a +nuw b, a +nuw c) => a +nuw (b umax c)`
#[no_mangle]
pub fn src6(a: u32, b: u32, c: u32) -> u32 {
    unsafe { max(a.unchecked_add(b), a.unchecked_add(c)) }
}
#[no_mangle]
pub fn tgt6(a: u32, b: u32, c: u32) -> u32 {
    unsafe { a.unchecked_add(max(b, c)) }
}

// * `umin(a +usat b, a +usat c) => a +usat (b umin c)`
#[no_mangle]
pub fn src7(a: u32, b: u32, c: u32) -> u32 {
    min(a.saturating_add(b), a.saturating_add(c))
}
#[no_mangle]
pub fn tgt7(a: u32, b: u32, c: u32) -> u32 {
    a.saturating_add(min(b, c))
}

// * `umin(a +nuw b, a +nuw c) => a +nuw (b umin c)`
#[no_mangle]
pub fn src8(a: u32, b: u32, c: u32) -> u32 {
    unsafe { min(a.unchecked_add(b), a.unchecked_add(c)) }
}
#[no_mangle]
pub fn tgt8(a: u32, b: u32, c: u32) -> u32 {
    unsafe { a.unchecked_add(min(b, c)) }
}

// * `smax(a +ssat b, a +ssat c) => a +ssat (b smax c)`
#[no_mangle]
pub fn src10(a: i32, b: i32, c: i32) -> i32 {
    max(a.saturating_add(b), a.saturating_add(c))
}
#[no_mangle]
pub fn tgt10(a: i32, b: i32, c: i32) -> i32 {
    a.saturating_add(max(b, c))
}

// * `smax(a +nsw b, a +nsw c) => a +nsw (b smax c)`
#[no_mangle]
pub fn src9(a: i32, b: i32, c: i32) -> i32 {
    unsafe { max(a.unchecked_add(b), a.unchecked_add(c)) }
}
#[no_mangle]
pub fn tgt9(a: i32, b: i32, c: i32) -> i32 {
    unsafe { a.unchecked_add(max(b, c)) }
}

// * `smin(a +ssat b, a +ssat c) => a +ssat (b smin c)`
#[no_mangle]
pub fn src11(a: i32, b: i32, c: i32) -> i32 {
    min(a.saturating_add(b), a.saturating_add(c))
}
#[no_mangle]
pub fn tgt11(a: i32, b: i32, c: i32) -> i32 {
    a.saturating_add(min(b, c))
}

// * `smin(a +nsw b, a +nsw c) => a +nsw (b smin c)`
#[no_mangle]
pub fn src12(a: i32, b: i32, c: i32) -> i32 {
    unsafe { min(a.unchecked_add(b), a.unchecked_add(c)) }
}
#[no_mangle]
pub fn tgt12(a: i32, b: i32, c: i32) -> i32 {
    unsafe { a.unchecked_add(min(b, c)) }
}

贡献者指南