Test source: git
Source: <stdin> ---------------------------------------- define <2 x i32> @umin_of_nots(<2 x i32> %x, <2 x i32> %y) { %0: %notx = xor <2 x i32> %x, { 4294967295, 4294967295 } %noty = xor <2 x i32> %y, { 4294967295, 4294967295 } %cmp = icmp ult <2 x i32> %notx, %noty %min = select <2 x i1> %cmp, <2 x i32> %notx, <2 x i32> %noty ret <2 x i32> %min } => define <2 x i32> @umin_of_nots(<2 x i32> %x, <2 x i32> %y) { %0: %1 = icmp ugt <2 x i32> %x, %y %2 = select <2 x i1> %1, <2 x i32> %x, <2 x i32> %y %min = xor <2 x i32> %2, { 4294967295, 4294967295 } ret <2 x i32> %min } Transformation doesn't verify! ERROR: Timeout ---------------------------------------- define <2 x i32> @smin_of_nots(<2 x i32> %x, <2 x i32> %y) { %0: %notx = xor <2 x i32> %x, { 4294967295, 4294967295 } %noty = xor <2 x i32> %y, { 4294967295, 4294967295 } %cmp = icmp sle <2 x i32> %notx, %noty %min = select <2 x i1> %cmp, <2 x i32> %notx, <2 x i32> %noty ret <2 x i32> %min } => define <2 x i32> @smin_of_nots(<2 x i32> %x, <2 x i32> %y) { %0: %1 = icmp sgt <2 x i32> %x, %y %2 = select <2 x i1> %1, <2 x i32> %x, <2 x i32> %y %min = xor <2 x i32> %2, { 4294967295, 4294967295 } ret <2 x i32> %min } Transformation doesn't verify! ERROR: Timeout ---------------------------------------- define i32 @compute_min_2(i32 %x, i32 %y) { %0: %not_x = sub i32 4294967295, %x %not_y = sub i32 4294967295, %y %cmp = icmp sgt i32 %not_x, %not_y %not_min = select i1 %cmp, i32 %not_x, i32 %not_y %min = sub i32 4294967295, %not_min ret i32 %min } => define i32 @compute_min_2(i32 %x, i32 %y) { %0: %1 = icmp slt i32 %x, %y %2 = select i1 %1, i32 %x, i32 %y ret i32 %2 } Transformation seems to be correct! ---------------------------------------- define i8 @umin_not_1_extra_use(i8 %x, i8 %y) { %0: %nx = xor i8 %x, 255 %ny = xor i8 %y, 255 %cmpxy = icmp ult i8 %nx, %ny %minxy = select i1 %cmpxy, i8 %nx, i8 %ny call void @extra_use(i8 %nx) ret i8 %minxy } => define i8 @umin_not_1_extra_use(i8 %x, i8 %y) { %0: %nx = xor i8 %x, 255 %1 = icmp ugt i8 %y, %x %2 = select i1 %1, i8 %y, i8 %x %minxy = xor i8 %2, 255 call void @extra_use(i8 %nx) ret i8 %minxy } Transformation doesn't verify! ERROR: Timeout ---------------------------------------- define i8 @umin_not_2_extra_use(i8 %x, i8 %y) { %0: %nx = xor i8 %x, 255 %ny = xor i8 %y, 255 %cmpxy = icmp ult i8 %nx, %ny %minxy = select i1 %cmpxy, i8 %nx, i8 %ny call void @extra_use(i8 %nx) call void @extra_use(i8 %ny) ret i8 %minxy } => define i8 @umin_not_2_extra_use(i8 %x, i8 %y) { %0: %nx = xor i8 %x, 255 %ny = xor i8 %y, 255 %cmpxy = icmp ult i8 %nx, %ny %minxy = select i1 %cmpxy, i8 %nx, i8 %ny call void @extra_use(i8 %nx) call void @extra_use(i8 %ny) ret i8 %minxy } Transformation seems to be correct! (syntactically equal) ---------------------------------------- define i8 @umin3_not(i8 %x, i8 %y, i8 %z) { %0: %nx = xor i8 %x, 255 %ny = xor i8 %y, 255 %nz = xor i8 %z, 255 %cmpyx = icmp ult i8 %y, %x %cmpxz = icmp ult i8 %nx, %nz %minxz = select i1 %cmpxz, i8 %nx, i8 %nz %cmpyz = icmp ult i8 %ny, %nz %minyz = select i1 %cmpyz, i8 %ny, i8 %nz %r = select i1 %cmpyx, i8 %minxz, i8 %minyz ret i8 %r } => define i8 @umin3_not(i8 %x, i8 %y, i8 %z) { %0: %1 = icmp ugt i8 %x, %z %2 = select i1 %1, i8 %x, i8 %z %3 = icmp ugt i8 %2, %y %r.v = select i1 %3, i8 %2, i8 %y %r = xor i8 %r.v, 255 ret i8 %r } Transformation doesn't verify! ERROR: Target's return value is more undefined Example: i8 %x = #x00 (0) i8 %y = undef i8 %z = #xff (255, -1) Source: i8 %nx = #xff (255, -1) i8 %ny = any i8 %nz = #x00 (0) i1 %cmpyx = #x0 (0) i1 %cmpxz = #x0 (0) i8 %minxz = #x00 (0) i1 %cmpyz = #x0 (0) i8 %minyz = #x00 (0) i8 %r = #x00 (0) Target: i1 %1 = #x0 (0) i8 %2 = #xff (255, -1) i1 %3 = #x0 (0) i8 %r.v = #x00 (0) i8 %r = #xff (255, -1) Source value: #x00 (0) Target value: #xff (255, -1) ------------------- SMT STATS ------------------- Num queries: 16 Num invalid: 0 Num skips: 0 Num trivial: 28 (63.6%) Num timeout: 3 (18.8%) Num errors: 0 (0.0%) Num SAT: 6 (37.5%) Num UNSAT: 7 (43.8%) Alive2: Transform doesn't verify; aborting!
+ : 'RUN: at line 2' + /home/nlopes/alive2/build/opt-alive.sh -S -instcombine + /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/InstCombine/max-of-nots.ll FileCheck error: '<stdin>' is empty. FileCheck command line: /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/InstCombine/max-of-nots.ll
NOTE: This test would pass if undef didn't exist!