Test source: git
Source: <stdin> ---------------------------------------- define i1 @logical_and_icmp(<4 x i32> %x) { %0: %x0 = extractelement <4 x i32> %x, i32 0 %x1 = extractelement <4 x i32> %x, i32 1 %x2 = extractelement <4 x i32> %x, i32 2 %x3 = extractelement <4 x i32> %x, i32 3 %c0 = icmp slt i32 %x0, 0 %c1 = icmp slt i32 %x1, 0 %c2 = icmp slt i32 %x2, 0 %c3 = icmp slt i32 %x3, 0 %s1 = select i1 %c0, i1 %c1, i1 0 %s2 = select i1 %s1, i1 %c2, i1 0 %s3 = select i1 %s2, i1 %c3, i1 0 ret i1 %s3 } => define i1 @logical_and_icmp(<4 x i32> %x) { %0: %1 = icmp slt <4 x i32> %x, { 0, 0, 0, 0 } %2 = freeze <4 x i1> %1 %3 = reduce_and <4 x i1> %2 ret i1 %3 } Transformation seems to be correct! ---------------------------------------- define i1 @logical_or_icmp(<4 x i32> %x, <4 x i32> %y) { %0: %x0 = extractelement <4 x i32> %x, i32 0 %x1 = extractelement <4 x i32> %x, i32 1 %x2 = extractelement <4 x i32> %x, i32 2 %x3 = extractelement <4 x i32> %x, i32 3 %y0 = extractelement <4 x i32> %y, i32 0 %y1 = extractelement <4 x i32> %y, i32 1 %y2 = extractelement <4 x i32> %y, i32 2 %y3 = extractelement <4 x i32> %y, i32 3 %c0 = icmp slt i32 %x0, %y0 %c1 = icmp slt i32 %x1, %y1 %c2 = icmp slt i32 %x2, %y2 %c3 = icmp slt i32 %x3, %y3 %s1 = select i1 %c0, i1 1, i1 %c1 %s2 = select i1 %s1, i1 1, i1 %c2 %s3 = select i1 %s2, i1 1, i1 %c3 ret i1 %s3 } => define i1 @logical_or_icmp(<4 x i32> %x, <4 x i32> %y) { %0: %1 = icmp slt <4 x i32> %x, %y %2 = freeze <4 x i1> %1 %3 = reduce_or <4 x i1> %2 ret i1 %3 } Transformation seems to be correct! ---------------------------------------- define i1 @logical_and_fcmp(<4 x float> %x) { %0: %x0 = extractelement <4 x float> %x, i32 0 %x1 = extractelement <4 x float> %x, i32 1 %x2 = extractelement <4 x float> %x, i32 2 %x3 = extractelement <4 x float> %x, i32 3 %c0 = fcmp olt float %x0, 0.000000 %c1 = fcmp olt float %x1, 0.000000 %c2 = fcmp olt float %x2, 0.000000 %c3 = fcmp olt float %x3, 0.000000 %s1 = select i1 %c0, i1 %c1, i1 0 %s2 = select i1 %s1, i1 %c2, i1 0 %s3 = select i1 %s2, i1 %c3, i1 0 ret i1 %s3 } => define i1 @logical_and_fcmp(<4 x float> %x) { %0: %1 = fcmp olt <4 x float> %x, { 0.000000, 0.000000, 0.000000, 0.000000 } %2 = freeze <4 x i1> %1 %3 = reduce_and <4 x i1> %2 ret i1 %3 } Transformation seems to be correct! ---------------------------------------- define i1 @logical_or_fcmp(<4 x float> %x) { %0: %x0 = extractelement <4 x float> %x, i32 0 %x1 = extractelement <4 x float> %x, i32 1 %x2 = extractelement <4 x float> %x, i32 2 %x3 = extractelement <4 x float> %x, i32 3 %c0 = fcmp olt float %x0, 0.000000 %c1 = fcmp olt float %x1, 0.000000 %c2 = fcmp olt float %x2, 0.000000 %c3 = fcmp olt float %x3, 0.000000 %s1 = select i1 %c0, i1 1, i1 %c1 %s2 = select i1 %s1, i1 1, i1 %c2 %s3 = select i1 %s2, i1 1, i1 %c3 ret i1 %s3 } => define i1 @logical_or_fcmp(<4 x float> %x) { %0: %1 = fcmp olt <4 x float> %x, { 0.000000, 0.000000, 0.000000, 0.000000 } %2 = freeze <4 x i1> %1 %3 = reduce_or <4 x i1> %2 ret i1 %3 } Transformation seems to be correct! ---------------------------------------- define i1 @logical_and_icmp_diff_preds(<4 x i32> %x) { %0: %x0 = extractelement <4 x i32> %x, i32 0 %x1 = extractelement <4 x i32> %x, i32 1 %x2 = extractelement <4 x i32> %x, i32 2 %x3 = extractelement <4 x i32> %x, i32 3 %c0 = icmp ult i32 %x0, 0 %c1 = icmp slt i32 %x1, 0 %c2 = icmp sgt i32 %x2, 0 %c3 = icmp slt i32 %x3, 0 %s1 = select i1 %c0, i1 %c1, i1 0 %s2 = select i1 %s1, i1 %c2, i1 0 %s3 = select i1 %s2, i1 %c3, i1 0 ret i1 %s3 } => define i1 @logical_and_icmp_diff_preds(<4 x i32> %x) { %0: %x0 = extractelement <4 x i32> %x, i32 0 %x1 = extractelement <4 x i32> %x, i32 1 %x2 = extractelement <4 x i32> %x, i32 2 %x3 = extractelement <4 x i32> %x, i32 3 %c0 = icmp ult i32 %x0, 0 %c1 = icmp slt i32 %x1, 0 %c2 = icmp sgt i32 %x2, 0 %c3 = icmp slt i32 %x3, 0 %s1 = select i1 %c0, i1 %c1, i1 0 %s2 = select i1 %s1, i1 %c2, i1 0 %s3 = select i1 %s2, i1 %c3, i1 0 ret i1 %s3 } Transformation seems to be correct! (syntactically equal) ---------------------------------------- define i1 @logical_and_icmp_diff_const(<4 x i32> %x) { %0: %x0 = extractelement <4 x i32> %x, i32 0 %x1 = extractelement <4 x i32> %x, i32 1 %x2 = extractelement <4 x i32> %x, i32 2 %x3 = extractelement <4 x i32> %x, i32 3 %c0 = icmp sgt i32 %x0, 0 %c1 = icmp sgt i32 %x1, 1 %c2 = icmp sgt i32 %x2, 2 %c3 = icmp sgt i32 %x3, 3 %s1 = select i1 %c0, i1 %c1, i1 0 %s2 = select i1 %s1, i1 %c2, i1 0 %s3 = select i1 %s2, i1 %c3, i1 0 ret i1 %s3 } => define i1 @logical_and_icmp_diff_const(<4 x i32> %x) { %0: %1 = icmp sgt <4 x i32> %x, { 0, 1, 2, 3 } %2 = freeze <4 x i1> %1 %3 = reduce_and <4 x i1> %2 ret i1 %3 } Transformation seems to be correct! ---------------------------------------- define i1 @mixed_logical_icmp(<4 x i32> %x) { %0: %x0 = extractelement <4 x i32> %x, i32 0 %x1 = extractelement <4 x i32> %x, i32 1 %x2 = extractelement <4 x i32> %x, i32 2 %x3 = extractelement <4 x i32> %x, i32 3 %c0 = icmp sgt i32 %x0, 0 %c1 = icmp sgt i32 %x1, 0 %c2 = icmp sgt i32 %x2, 0 %c3 = icmp sgt i32 %x3, 0 %s1 = select i1 %c0, i1 %c1, i1 0 %s2 = select i1 %s1, i1 1, i1 %c2 %s3 = select i1 %s2, i1 %c3, i1 0 ret i1 %s3 } => define i1 @mixed_logical_icmp(<4 x i32> %x) { %0: %x0 = extractelement <4 x i32> %x, i32 0 %x1 = extractelement <4 x i32> %x, i32 1 %x2 = extractelement <4 x i32> %x, i32 2 %x3 = extractelement <4 x i32> %x, i32 3 %c0 = icmp sgt i32 %x0, 0 %c1 = icmp sgt i32 %x1, 0 %c2 = icmp sgt i32 %x2, 0 %c3 = icmp sgt i32 %x3, 0 %s1 = select i1 %c0, i1 %c1, i1 0 %s2 = select i1 %s1, i1 1, i1 %c2 %s3 = select i1 %s2, i1 %c3, i1 0 ret i1 %s3 } Transformation seems to be correct! (syntactically equal) ---------------------------------------- define i1 @logical_and_icmp_clamp(<4 x i32> %x) { %0: %x0 = extractelement <4 x i32> %x, i32 0 %x1 = extractelement <4 x i32> %x, i32 1 %x2 = extractelement <4 x i32> %x, i32 2 %x3 = extractelement <4 x i32> %x, i32 3 %c0 = icmp slt i32 %x0, 42 %c1 = icmp slt i32 %x1, 42 %c2 = icmp slt i32 %x2, 42 %c3 = icmp slt i32 %x3, 42 %d0 = icmp sgt i32 %x0, 17 %d1 = icmp sgt i32 %x1, 17 %d2 = icmp sgt i32 %x2, 17 %d3 = icmp sgt i32 %x3, 17 %s1 = select i1 %c0, i1 %c1, i1 0 %s2 = select i1 %s1, i1 %c2, i1 0 %s3 = select i1 %s2, i1 %c3, i1 0 %s4 = select i1 %s3, i1 %d0, i1 0 %s5 = select i1 %s4, i1 %d1, i1 0 %s6 = select i1 %s5, i1 %d2, i1 0 %s7 = select i1 %s6, i1 %d3, i1 0 ret i1 %s7 } => define i1 @logical_and_icmp_clamp(<4 x i32> %x) { %0: %1 = extractelement <4 x i32> %x, i32 3 %2 = extractelement <4 x i32> %x, i32 2 %3 = extractelement <4 x i32> %x, i32 1 %4 = extractelement <4 x i32> %x, i32 0 %5 = icmp slt <4 x i32> %x, { 42, 42, 42, 42 } %d0 = icmp sgt i32 %4, 17 %d1 = icmp sgt i32 %3, 17 %d2 = icmp sgt i32 %2, 17 %d3 = icmp sgt i32 %1, 17 %6 = freeze <4 x i1> %5 %7 = reduce_and <4 x i1> %6 %8 = and i1 %7, %d0 %9 = and i1 %8, %d1 %10 = and i1 %9, %d2 %s7 = select i1 %10, i1 %d3, i1 0 ret i1 %s7 } Transformation doesn't verify! ERROR: Target is more poisonous than source Example: <4 x i32> %x = < #x0000002a (42), poison, poison, poison > Source: i32 %x0 = #x0000002a (42) i32 %x1 = poison i32 %x2 = poison i32 %x3 = poison i1 %c0 = #x0 (0) i1 %c1 = poison i1 %c2 = poison i1 %c3 = poison i1 %d0 = #x1 (1) i1 %d1 = poison i1 %d2 = poison i1 %d3 = poison i1 %s1 = #x0 (0) i1 %s2 = #x0 (0) i1 %s3 = #x0 (0) i1 %s4 = #x0 (0) i1 %s5 = #x0 (0) i1 %s6 = #x0 (0) i1 %s7 = #x0 (0) Target: i32 %1 = poison i32 %2 = poison i32 %3 = poison i32 %4 = #x0000002a (42) <4 x i1> %5 = < #x0 (0), poison, poison, poison > i1 %d0 = #x1 (1) i1 %d1 = poison i1 %d2 = poison i1 %d3 = poison <4 x i1> %6 = < #x0 (0), #x1 (1), #x1 (1), #x1 (1) > i1 %7 = #x0 (0) i1 %8 = #x0 (0) i1 %9 = poison i1 %10 = poison i1 %s7 = poison Source value: #x0 (0) Target value: poison ------------------- SMT STATS ------------------- Num queries: 12 Num invalid: 0 Num skips: 0 Num trivial: 48 (80.0%) Num timeout: 0 (0.0%) Num errors: 0 (0.0%) Num SAT: 7 (58.3%) Num UNSAT: 5 (41.7%) Alive2: Transform doesn't verify; aborting!
+ : 'RUN: at line 2' + /home/nlopes/alive2/build/opt-alive.sh -slp-vectorizer -mtriple=x86_64-- -S + /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/SLPVectorizer/X86/reduction-logical.ll FileCheck error: '<stdin>' is empty. FileCheck command line: /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/SLPVectorizer/X86/reduction-logical.ll