[Transforms] Failure to fold select chain as frozen bool reductions
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
```ll
define i1 @src_red(<2 x i4> %x, <2 x i4> %y) {
%cmp = icmp sgt <2 x i4> %x, %y
%b0 = extractelement <2 x i1> %cmp, i64 0
%b1 = extractelement <2 x i1> %cmp, i64 1
%b = select i1 %b0, i1 %b1, i1 false
ret i1 %b
}
define i1 @tgt_red(<2 x i4> %x, <2 x i4> %y) {
%cmp = icmp sgt <2 x i4> %x, %y
%cmp.f = freeze <2 x i1> %cmp
%red = call i1 @llvm.vector.reduce.and(<2 x i1> %cmp.f)
ret i1 %red
}
define i1 @src_bc(<2 x i4> %x, <2 x i4> %y) {
%cmp = icmp sgt <2 x i4> %x, %y
%b0 = extractelement <2 x i1> %cmp, i64 0
%b1 = extractelement <2 x i1> %cmp, i64 1
%b = select i1 %b0, i1 %b1, i1 false
ret i1 %b
}
define i1 @tgt_bc(<2 x i4> %x, <2 x i4> %y) {
%cmp = icmp sgt <2 x i4> %x, %y
%cmp.f = freeze <2 x i1> %cmp
%bc = bitcast <2 x i1> %cmp.f to i2
%b = icmp eq i2 %bc, -1
ret i1 %b
}
```
-->
```ll
----------------------------------------
define i1 @src_red(<2 x i4> %x, <2 x i4> %y) {
#0:
%cmp = icmp sgt <2 x i4> %x, %y
%b0 = extractelement <2 x i1> %cmp, i64 0
%b1 = extractelement <2 x i1> %cmp, i64 1
%b = select i1 %b0, i1 %b1, i1 0
ret i1 %b
}
=>
define i1 @tgt_red(<2 x i4> %x, <2 x i4> %y) {
#0:
%cmp = icmp sgt <2 x i4> %x, %y
%cmp.f = freeze <2 x i1> %cmp
%red = reduce_and <2 x i1> %cmp.f
ret i1 %red
}
Transformation seems to be correct!
----------------------------------------
define i1 @src_bc(<2 x i4> %x, <2 x i4> %y) {
#0:
%cmp = icmp sgt <2 x i4> %x, %y
%b0 = extractelement <2 x i1> %cmp, i64 0
%b1 = extractelement <2 x i1> %cmp, i64 1
%b = select i1 %b0, i1 %b1, i1 0
ret i1 %b
}
=>
define i1 @tgt_bc(<2 x i4> %x, <2 x i4> %y) {
#0:
%cmp = icmp sgt <2 x i4> %x, %y
%cmp.f = freeze <2 x i1> %cmp
%bc = bitcast <2 x i1> %cmp.f to i2
%b = icmp eq i2 %bc, 3
ret i1 %b
}
Transformation seems to be correct!
```
The bool reduction calls are always folded to bitcasted scalar integer ops by InstCombine, but I wanted to show they're both correct.
or/xor reductions probably have something similar
Contributor guide
Assessment
This issue has not been assessed yet.