Skip to content

Commit 554feb0

Browse files
authored
[InstSimplify] Simplify select cond, undef, val to val if val = poison implies cond = poison (#76465)
This patch folds: ``` select cond, undef, val -> val select cond, val, undef -> val ``` iff `impliesPoison(val, cond)` returns true. Example: ``` define i32 @SRC1(i32 %retval.0.i.i) { %cmp.i = icmp sgt i32 %retval.0.i.i, -1 %spec.select.i = select i1 %cmp.i, i32 %retval.0.i.i, i32 undef ret i32 %spec.select.i } define i32 @tgt1(i32 %retval.0.i.i) { ret i32 %retval.0.i.i } ``` Alive2: https://alive2.llvm.org/ce/z/okJW3G Compile-time impact: http://llvm-compile-time-tracker.com/compare.php?from=38c9390b59c4d2b9181614d6a909887497d3692f&to=e146f51ba278aa3bb6879a9ec651831ac8938e91&stat=instructions%3Au
1 parent 3d7880b commit 554feb0

File tree

4 files changed

+9
-22
lines changed

4 files changed

+9
-22
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4869,14 +4869,12 @@ static Value *simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
48694869
// select ?, poison, X -> X
48704870
// select ?, undef, X -> X
48714871
if (isa<PoisonValue>(TrueVal) ||
4872-
(Q.isUndefValue(TrueVal) &&
4873-
isGuaranteedNotToBePoison(FalseVal, Q.AC, Q.CxtI, Q.DT)))
4872+
(Q.isUndefValue(TrueVal) && impliesPoison(FalseVal, Cond)))
48744873
return FalseVal;
48754874
// select ?, X, poison -> X
48764875
// select ?, X, undef -> X
48774876
if (isa<PoisonValue>(FalseVal) ||
4878-
(Q.isUndefValue(FalseVal) &&
4879-
isGuaranteedNotToBePoison(TrueVal, Q.AC, Q.CxtI, Q.DT)))
4877+
(Q.isUndefValue(FalseVal) && impliesPoison(TrueVal, Cond)))
48804878
return TrueVal;
48814879

48824880
// Deal with partial undef vector constants: select ?, VecC, VecC' --> VecC''

llvm/test/Transforms/InstCombine/select.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2895,10 +2895,7 @@ define i8 @select_replacement_loop(i8 %x, i8 %y, i8 %z) {
28952895
define i32 @select_replacement_loop2(i32 %arg, i32 %arg2) {
28962896
; CHECK-LABEL: @select_replacement_loop2(
28972897
; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ARG:%.*]], [[ARG2:%.*]]
2898-
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[DIV]], [[ARG2]]
2899-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MUL]], [[ARG]]
2900-
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[DIV]], i32 undef
2901-
; CHECK-NEXT: ret i32 [[SEL]]
2898+
; CHECK-NEXT: ret i32 [[DIV]]
29022899
;
29032900
%div = udiv i32 %arg, %arg2
29042901
%mul = mul nsw i32 %div, %arg2
@@ -3627,8 +3624,8 @@ define i32 @pr62088() {
36273624
; CHECK: loop:
36283625
; CHECK-NEXT: [[NOT2:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ -2, [[LOOP]] ]
36293626
; CHECK-NEXT: [[H_0:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 1, [[LOOP]] ]
3630-
; CHECK-NEXT: [[XOR1:%.*]] = or disjoint i32 [[H_0]], [[NOT2]]
3631-
; CHECK-NEXT: [[SUB5:%.*]] = sub i32 -1824888657, [[XOR1]]
3627+
; CHECK-NEXT: [[XOR:%.*]] = or disjoint i32 [[H_0]], [[NOT2]]
3628+
; CHECK-NEXT: [[SUB5:%.*]] = sub i32 -1824888657, [[XOR]]
36323629
; CHECK-NEXT: [[XOR6:%.*]] = xor i32 [[SUB5]], -1260914025
36333630
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[XOR6]], 824855120
36343631
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]]

llvm/test/Transforms/InstSimplify/select-inseltpoison.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -926,12 +926,8 @@ define <2 x i32> @all_constant_true_undef_false_constexpr_vec() {
926926

927927
define i1 @expand_binop_undef(i32 %x, i32 %y) {
928928
; CHECK-LABEL: @expand_binop_undef(
929-
; CHECK-NEXT: [[CMP9_NOT_1:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]
930-
; CHECK-NEXT: [[CMP15:%.*]] = icmp slt i32 [[X]], [[Y]]
931-
; CHECK-NEXT: [[SPEC_SELECT39:%.*]] = select i1 [[CMP9_NOT_1]], i1 undef, i1 [[CMP15]]
932-
; CHECK-NEXT: [[SPEC_SELECT40:%.*]] = xor i1 [[CMP9_NOT_1]], true
933-
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = and i1 [[SPEC_SELECT39]], [[SPEC_SELECT40]]
934-
; CHECK-NEXT: ret i1 [[SPEC_SELECT]]
929+
; CHECK-NEXT: [[CMP15:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
930+
; CHECK-NEXT: ret i1 [[CMP15]]
935931
;
936932
%cmp9.not.1 = icmp eq i32 %x, %y
937933
%cmp15 = icmp slt i32 %x, %y

llvm/test/Transforms/InstSimplify/select.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -971,12 +971,8 @@ define <2 x i32> @all_constant_true_undef_false_constexpr_vec() {
971971

972972
define i1 @expand_binop_undef(i32 %x, i32 %y) {
973973
; CHECK-LABEL: @expand_binop_undef(
974-
; CHECK-NEXT: [[CMP9_NOT_1:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]
975-
; CHECK-NEXT: [[CMP15:%.*]] = icmp slt i32 [[X]], [[Y]]
976-
; CHECK-NEXT: [[SPEC_SELECT39:%.*]] = select i1 [[CMP9_NOT_1]], i1 undef, i1 [[CMP15]]
977-
; CHECK-NEXT: [[SPEC_SELECT40:%.*]] = xor i1 [[CMP9_NOT_1]], true
978-
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = and i1 [[SPEC_SELECT39]], [[SPEC_SELECT40]]
979-
; CHECK-NEXT: ret i1 [[SPEC_SELECT]]
974+
; CHECK-NEXT: [[CMP15:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
975+
; CHECK-NEXT: ret i1 [[CMP15]]
980976
;
981977
%cmp9.not.1 = icmp eq i32 %x, %y
982978
%cmp15 = icmp slt i32 %x, %y

0 commit comments

Comments
 (0)