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

Test source: git

Comments: LLVM PR55734

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
  %c2 = icmp sgt i32 %x2, 0
  %1 = insertelement <2 x i32> poison, i32 %x3, i32 0
  %2 = insertelement <2 x i32> %1, i32 %x1, i32 1
  %3 = icmp slt <2 x i32> %2, { 0, 0 }
  %4 = extractelement <2 x i1> %3, i32 1
  %s1 = select i1 %c0, i1 %4, i1 0
  %s2 = select i1 %s1, i1 %c2, i1 0
  %5 = extractelement <2 x i1> %3, i32 0
  %s3 = select i1 %s2, i1 %5, i1 0
  ret i1 %s3
}
Transformation seems to be correct!


----------------------------------------
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:
  %1 = icmp sgt <4 x i32> %x, { 0, 0, 0, 0 }
  %2 = extractelement <4 x i1> %1, i32 0
  %3 = extractelement <4 x i1> %1, i32 1
  %s1 = select i1 %2, i1 %3, i1 0
  %4 = extractelement <4 x i1> %1, i32 2
  %s2 = select i1 %s1, i1 1, i1 %4
  %5 = extractelement <4 x i1> %1, i32 3
  %s3 = select i1 %s2, i1 %5, i1 0
  ret i1 %s3
}
Transformation seems to be correct!


----------------------------------------
define i1 @logical_and_icmp_subvec(<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
  %c0 = icmp slt i32 %x0, 0
  %c1 = icmp slt i32 %x1, 0
  %c2 = icmp slt i32 %x2, 0
  %s1 = select i1 %c0, i1 %c1, i1 0
  %s2 = select i1 %s1, i1 %c2, i1 0
  ret i1 %s2
}
=>
define i1 @logical_and_icmp_subvec(<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
  %1 = insertelement <2 x i32> poison, i32 %x1, i32 0
  %2 = insertelement <2 x i32> %1, i32 %x0, i32 1
  %3 = icmp slt <2 x i32> %2, { 0, 0 }
  %c2 = icmp slt i32 %x2, 0
  %4 = extractelement <2 x i1> %3, i32 0
  %5 = extractelement <2 x i1> %3, i32 1
  %s1 = select i1 %5, i1 %4, i1 0
  %s2 = select i1 %s1, i1 %c2, i1 0
  ret i1 %s2
}
Transformation seems to be correct!


----------------------------------------
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 = icmp slt <4 x i32> %x, { 42, 42, 42, 42 }
  %2 = icmp sgt <4 x i32> %x, { 17, 17, 17, 17 }
  %3 = freeze <4 x i1> %2
  %4 = reduce_and <4 x i1> %3
  %5 = freeze <4 x i1> %1
  %6 = reduce_and <4 x i1> %5
  %op.rdx = select i1 %4, i1 %6, i1 0
  ret i1 %op.rdx
}
Transformation seems to be correct!


----------------------------------------
define i1 @logical_and_icmp_clamp_extra_use_cmp(<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
  call void @use1(i1 %c2)
  %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_extra_use_cmp(<4 x i32> %x) {
%0:
  %1 = icmp slt <4 x i32> %x, { 42, 42, 42, 42 }
  %2 = extractelement <4 x i1> %1, i32 2
  call void @use1(i1 %2)
  %3 = icmp sgt <4 x i32> %x, { 17, 17, 17, 17 }
  %4 = freeze <4 x i1> %3
  %5 = reduce_and <4 x i1> %4
  %6 = freeze <4 x i1> %1
  %7 = reduce_and <4 x i1> %6
  %op.rdx = select i1 %5, i1 %7, i1 0
  ret i1 %op.rdx
}
Transformation seems to be correct!


----------------------------------------
define i1 @logical_and_icmp_clamp_extra_use_select(<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
  call void @use1(i1 %s2)
  %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_extra_use_select(<4 x i32> %x) {
%0:
  %1 = icmp slt <4 x i32> %x, { 42, 42, 42, 42 }
  %2 = icmp sgt <4 x i32> %x, { 17, 17, 17, 17 }
  %3 = extractelement <4 x i1> %1, i32 0
  %4 = extractelement <4 x i1> %1, i32 1
  %s1 = select i1 %3, i1 %4, i1 0
  %5 = extractelement <4 x i1> %1, i32 2
  %s2 = select i1 %s1, i1 %5, i1 0
  call void @use1(i1 %s2)
  %6 = freeze <4 x i1> %2
  %7 = reduce_and <4 x i1> %6
  %8 = extractelement <4 x i1> %1, i32 3
  %op.rdx = select i1 %7, i1 %8, i1 0
  %op.rdx1 = select i1 %op.rdx, i1 %s2, i1 0
  ret i1 %op.rdx1
}
Transformation doesn't verify!
ERROR: Target is more poisonous than source

Example:
<4 x i32> %x = < #x00400000 (4194304), poison, poison, poison >

Source:
i32 %x0 = #x00400000 (4194304)
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)

SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 >	size: 0	align: 1	alloc type: 0
Block 1 >	size: 0	align: 1

Target:
<4 x i1> %1 = < #x0 (0), poison, poison, poison >
<4 x i1> %2 = < #x1 (1), poison, poison, poison >
i1 %3 = #x0 (0)
i1 %4 = poison
i1 %s1 = #x0 (0)
i1 %5 = poison
i1 %s2 = #x0 (0)
<4 x i1> %6 = < #x1 (1), #x1 (1), #x1 (1), #x1 (1) >
i1 %7 = #x1 (1)
i1 %8 = poison
i1 %op.rdx = poison
i1 %op.rdx1 = poison
Source value: #x0 (0)
Target value: poison


------------------- SMT STATS -------------------
Num queries: 51
Num invalid: 0
Num skips:   0
Num trivial: 67 (56.8%)
Num timeout: 0 (0.0%)
Num errors:  0 (0.0%)
Num SAT:     34 (66.7%)
Num UNSAT:   17 (33.3%)
Alive2: Transform doesn't verify; aborting!

stderr:

+ : 'RUN: at line 2'
+ /home/nuno/llvm/build/bin/FileCheck /home/nuno/llvm/llvm/test/Transforms/SLPVectorizer/X86/reduction-logical.ll --check-prefixes=CHECK,SSE
+ /home/nuno/alive2/build/opt-alive.sh -slp-vectorizer -mtriple=x86_64-- -S

FileCheck error: '<stdin>' is empty.
FileCheck command line:  /home/nuno/llvm/build/bin/FileCheck /home/nuno/llvm/llvm/test/Transforms/SLPVectorizer/X86/reduction-logical.ll --check-prefixes=CHECK,SSE

 

<-- Back