Test source: git
Source: <stdin> ---------------------------------------- define i32 @modulo2(i32 %x) { %0: %rem.i = srem i32 %x, 2 %cmp.i = icmp slt i32 %rem.i, 0 %add.i = select i1 %cmp.i, i32 2, i32 0 %ret.i = add nsw i32 %add.i, %rem.i ret i32 %ret.i } => define i32 @modulo2(i32 %x) { %0: %rem.i = srem i32 %x, 2 %1 = and i32 %rem.i, 2 %ret.i = add nsw i32 %1, %rem.i ret i32 %ret.i } Transformation seems to be correct! ---------------------------------------- define <2 x i32> @modulo2_vec(<2 x i32> %x) { %0: %rem.i = srem <2 x i32> %x, { 2, 2 } %cmp.i = icmp slt <2 x i32> %rem.i, { 0, 0 } %add.i = select <2 x i1> %cmp.i, <2 x i32> { 2, 2 }, <2 x i32> { 0, 0 } %ret.i = add nsw <2 x i32> %add.i, %rem.i ret <2 x i32> %ret.i } => define <2 x i32> @modulo2_vec(<2 x i32> %x) { %0: %rem.i = srem <2 x i32> %x, { 2, 2 } %1 = and <2 x i32> %rem.i, { 2, 2 } %ret.i = add nsw <2 x i32> %1, %rem.i ret <2 x i32> %ret.i } Transformation doesn't verify! ERROR: Target is more poisonous than source Example: <2 x i32> %x = < poison, #x00000001 (1) > Source: <2 x i32> %rem.i = < poison, #x00000001 (1) > <2 x i1> %cmp.i = < poison, #x0 (0) > <2 x i32> %add.i = < poison, #x00000000 (0) > <2 x i32> %ret.i = < poison, #x00000001 (1) > Target: <2 x i32> %rem.i = < poison, #x00000001 (1) > <2 x i32> %1 = < poison, poison > <2 x i32> %ret.i = < poison, poison > Source value: < poison, #x00000001 (1) > Target value: < poison, poison > ------------------- SMT STATS ------------------- Num queries: 17 Num invalid: 0 Num skips: 0 Num trivial: 12 (41.4%) Num timeout: 0 (0.0%) Num errors: 0 (0.0%) Num SAT: 14 (82.4%) Num UNSAT: 3 (17.6%) Alive2: Transform doesn't verify; aborting!
+ : 'RUN: at line 2' + /home/nuno/llvm/build/bin/FileCheck /home/nuno/llvm/llvm/test/Transforms/InstCombine/modulo.ll + /home/nuno/alive2/build/opt-alive.sh -S -passes=instcombine FileCheck error: '<stdin>' is empty. FileCheck command line: /home/nuno/llvm/build/bin/FileCheck /home/nuno/llvm/llvm/test/Transforms/InstCombine/modulo.ll