Test Failure: Transforms/SLPVectorizer/X86/reduction-logical.ll

Test source: git

Log:

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!

stderr:

+ : '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

 

<-- Back