llvm / llvm/llvm-project

[Transforms] Failure to fold select chain as frozen bool reductions

Open
#214,430 1 comment 0 reactions 1 assignee Claimed by @user1342234 View on GitHub
llvm:instcombine llvm:transforms llvm:vectorcombine missed-optimization
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.