diff options
author | Sanjay Patel <spatel@rotateright.com> | 2021-12-29 15:53:56 -0500 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2021-12-29 15:53:56 -0500 |
commit | 6c716c8589506cec407f01b0cd60005a3e346cf0 (patch) | |
tree | 89722a11388426de85ffbc780cbc6da0e845ac0e /llvm/lib/Bitcode/Reader/BitcodeReader.cpp | |
parent | baa22e9327a85ce16f2d112c610d828f2ce1cb1c (diff) | |
download | llvm-6c716c8589506cec407f01b0cd60005a3e346cf0.zip llvm-6c716c8589506cec407f01b0cd60005a3e346cf0.tar.gz llvm-6c716c8589506cec407f01b0cd60005a3e346cf0.tar.bz2 |
[InstCombine] add more folds for unsigned overflow checks
((Op1 + C) & C) u< Op1 --> Op1 != 0
((Op1 + C) & C) u>= Op1 --> Op1 == 0
Op0 u> ((Op0 + C) & C) --> Op0 != 0
Op0 u<= ((Op0 + C) & C) --> Op0 == 0
https://alive2.llvm.org/ce/z/iUfXJN
https://alive2.llvm.org/ce/z/caAtjj
define i1 @src(i8 %x, i8 %y) {
; the add/mask must be with a low-bit mask (0x01ff...)
%y1 = add i8 %y, 1
%pop = call i8 @llvm.ctpop.i8(i8 %y1)
%ismask = icmp eq i8 %pop, 1
call void @llvm.assume(i1 %ismask)
%a = add i8 %x, %y
%m = and i8 %a, %y
%r = icmp ult i8 %m, %x
ret i1 %r
}
define i1 @tgt(i8 %x, i8 %y) {
%r = icmp ne i8 %x, 0
ret i1 %r
}
I suspect this can be generalized in some way, but this
is the pattern I'm seeing in a motivating test based on
issue #52851.
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
0 files changed, 0 insertions, 0 deletions