This is a bug in test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-sge-to-icmp-sle.ll Output of Alive2: declare i1 @pv(i8 %x, i8 %y) { %tmp0 = lshr i8 255, %y %tmp1 = and i8 %tmp0, %x %ret = icmp sge i8 %tmp1, %x ret i1 %ret } => declare i1 @pv(i8 %x, i8 %y) { %tmp0 = lshr i8 255, %y %1 = icmp sge i8 %tmp0, %x ret i1 %1 } Transformation doesn't verify! ERROR: Value mismatch Example: i8 %x = 0x7e (126) i8 %y = 0x0 (0) Source: i8 %tmp0 = 0xff (255, -1) i8 %tmp1 = 0x7e (126) i1 %ret = 0x1 (1, -1) Target: i8 %tmp0 = 0xff (255, -1) i1 %1 = 0x0 (0) Source value: 0x1 (1, -1) Target value: 0x0 (0)
Hm, lookiug..
(In reply to Roman Lebedev from comment #1) > Hm, lookiug.. Okay, so that is because in %tmp0 = lshr i8 255, %y %y is 0. Ouch. That was not caught in the initial check, which was rL337109 https://rise4fun.com/Alive/I3O because Pre: isPowerOf2(C1+1) where C1 was -1, so C1+1 would be 0, which is not PowerOf2 so it wasn't checked Can you tell if any other canonicalize-constant-low-bit-mask-and-icmp-* are bad?
The only other test 'canonicalize-*' test I see failing is this: canonicalize-constant-low-bit-mask-and-icmp-slt-to-icmp-sgt.ll declare i1 @pv(i8 %x, i8 %y) { %tmp0 = lshr i8 255, %y %tmp1 = and i8 %tmp0, %x %ret = icmp slt i8 %tmp1, %x ret i1 %ret } => declare i1 @pv(i8 %x, i8 %y) { %tmp0 = lshr i8 255, %y %1 = icmp slt i8 %tmp0, %x ret i1 %1 } Transformation doesn't verify! ERROR: Value mismatch Example: i8 %x = 0x7e (126) i8 %y = 0x0 (0) Source: i8 %tmp0 = 0xff (255, -1) i8 %tmp1 = 0x7e (126) i1 %ret = 0x0 (0) Target: i8 %tmp0 = 0xff (255, -1) i1 %1 = 0x1 (1, -1) Source value: 0x0 (0) Target value: 0x1 (1, -1)
Got alive2 to work, can confirm that this test file is failing. (In reply to Nuno Lopes from comment #3) > The only other test 'canonicalize-*' test I see failing is this: > > canonicalize-constant-low-bit-mask-and-icmp-slt-to-icmp-sgt.ll Ok, thank you, i will take care of that.
Thanks for reporting!