[PATCH] D156058: [InstCombine] Fix bug in canonicalization of Pow2 Tests (From: D152673)
Noah Goldstein via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 23 09:09:47 PDT 2023
goldstein.w.n added a comment.
I kept this out of the commit message because its a bit too verbose, but heres the alive2 output for all the transforms:
----------------------------------------
define i1 @blsmsk_is_p2_or_z_ule_xy(i8 %xx, i8 %yy) {
%0:
%x = or i8 %xx, %yy
%xm1 = add i8 %x, 255
%y = xor i8 %x, %xm1
%r = icmp ule i8 %x, %y
ret i1 %r
}
=>
define i1 @blsmsk_is_p2_or_z_ule_xy(i8 %xx, i8 %yy) nofree willreturn memory(none) {
%0:
%x = or i8 %yy, %xx
%1 = ctpop i8 %x
%1_range = !range i8 %1, i8 0, i8 9
%r = icmp ult i8 %1_range, 2
ret i1 %r
}
Transformation seems to be correct!
----------------------------------------
define i1 @blsmsk_is_p2_or_z_ule_yx_fail(i8 %xx, i8 %yy) {
%0:
%x = or i8 %xx, %yy
%xm1 = add i8 %x, 255
%y = xor i8 %x, %xm1
%r = icmp ule i8 %y, %x
ret i1 %r
}
=>
define i1 @blsmsk_is_p2_or_z_ule_yx_fail(i8 %xx, i8 %yy) nofree willreturn memory(none) {
%0:
%x = or i8 %yy, %xx
%xm1 = add i8 %x, 255
%y = xor i8 %xm1, %x
%r = icmp ule i8 %y, %x
ret i1 %r
}
Transformation seems to be correct!
----------------------------------------
define i1 @blsmsk_is_p2_or_z_uge_yx(i8 %xx, i8 %yy) {
%0:
%x = or i8 %xx, %yy
%xm1 = add i8 %x, 255
%y = xor i8 %x, %xm1
%r = icmp uge i8 %y, %x
ret i1 %r
}
=>
define i1 @blsmsk_is_p2_or_z_uge_yx(i8 %xx, i8 %yy) nofree willreturn memory(none) {
%0:
%x = or i8 %yy, %xx
%1 = ctpop i8 %x
%1_range = !range i8 %1, i8 0, i8 9
%r = icmp ult i8 %1_range, 2
ret i1 %r
}
Transformation seems to be correct!
----------------------------------------
define i1 @blsmsk_is_p2_or_z_uge_xy_fail(i8 %xx, i8 %yy) {
%0:
%x = or i8 %xx, %yy
%xm1 = add i8 %x, 255
%y = xor i8 %x, %xm1
%r = icmp uge i8 %x, %y
ret i1 %r
}
=>
define i1 @blsmsk_is_p2_or_z_uge_xy_fail(i8 %xx, i8 %yy) nofree willreturn memory(none) {
%0:
%x = or i8 %yy, %xx
%xm1 = add i8 %x, 255
%y = xor i8 %xm1, %x
%r = icmp uge i8 %x, %y
ret i1 %r
}
Transformation seems to be correct!
----------------------------------------
define i1 @blsmsk_isnt_p2_or_z_ugt_xy(i8 %xx, i8 %yy) {
%0:
%x = or i8 %xx, %yy
%xm1 = add i8 %x, 255
%y = xor i8 %x, %xm1
%r = icmp ugt i8 %x, %y
ret i1 %r
}
=>
define i1 @blsmsk_isnt_p2_or_z_ugt_xy(i8 %xx, i8 %yy) nofree willreturn memory(none) {
%0:
%x = or i8 %yy, %xx
%1 = ctpop i8 %x
%1_range = !range i8 %1, i8 0, i8 9
%r = icmp ugt i8 %1_range, 1
ret i1 %r
}
Transformation seems to be correct!
----------------------------------------
define i1 @blsmsk_isnt_p2_or_z_ugt_yx_fail(i8 %xx, i8 %yy) {
%0:
%x = or i8 %xx, %yy
%xm1 = add i8 %x, 255
%y = xor i8 %x, %xm1
%r = icmp ugt i8 %y, %x
ret i1 %r
}
=>
define i1 @blsmsk_isnt_p2_or_z_ugt_yx_fail(i8 %xx, i8 %yy) nofree willreturn memory(none) {
%0:
%x = or i8 %yy, %xx
%xm1 = add i8 %x, 255
%y = xor i8 %xm1, %x
%r = icmp ugt i8 %y, %x
ret i1 %r
}
Transformation seems to be correct!
----------------------------------------
define i1 @blsmsk_isnt_p2_or_z_ult_yx(i8 %xx, i8 %yy) {
%0:
%x = or i8 %xx, %yy
%xm1 = add i8 %x, 255
%y = xor i8 %x, %xm1
%r = icmp ult i8 %y, %x
ret i1 %r
}
=>
define i1 @blsmsk_isnt_p2_or_z_ult_yx(i8 %xx, i8 %yy) nofree willreturn memory(none) {
%0:
%x = or i8 %yy, %xx
%1 = ctpop i8 %x
%1_range = !range i8 %1, i8 0, i8 9
%r = icmp ugt i8 %1_range, 1
ret i1 %r
}
Transformation seems to be correct!
----------------------------------------
define i1 @blsmsk_isnt_p2_or_z_ult_xy_fail(i8 %xx, i8 %yy) {
%0:
%x = or i8 %xx, %yy
%xm1 = add i8 %x, 255
%y = xor i8 %x, %xm1
%r = icmp ult i8 %x, %y
ret i1 %r
}
=>
define i1 @blsmsk_isnt_p2_or_z_ult_xy_fail(i8 %xx, i8 %yy) nofree willreturn memory(none) {
%0:
%x = or i8 %yy, %xx
%xm1 = add i8 %x, 255
%y = xor i8 %xm1, %x
%r = icmp ult i8 %x, %y
ret i1 %r
}
Transformation seems to be correct!
Summary:
8 correct transformations
0 incorrect transformations
0 failed-to-prove transformations
0 Alive2 errors
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D156058/new/
https://reviews.llvm.org/D156058
More information about the llvm-commits
mailing list