Skip to content

Commit 3e8c74f

Browse files
committed
Add back in SDiv/UDiv/URem/SRem, but don't freeze them
1 parent c558702 commit 3e8c74f

File tree

2 files changed

+31
-29
lines changed

2 files changed

+31
-29
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -907,12 +907,20 @@ static Instruction *foldSelectZeroOrFixedOp(SelectInst &SI,
907907
if (TrueValC == nullptr || !isa<Instruction>(FalseVal))
908908
return nullptr;
909909

910-
if (!(match(FalseVal, m_c_Mul(m_Specific(X), m_Value(Y))) ||
911-
match(FalseVal, m_c_And(m_Specific(X), m_Value(Y))) ||
912-
match(FalseVal, m_FShl(m_Specific(X), m_Specific(X), m_Value(Y))) ||
913-
match(FalseVal, m_FShr(m_Specific(X), m_Specific(X), m_Value(Y))) ||
914-
match(FalseVal,
915-
m_c_Intrinsic<Intrinsic::umin>(m_Specific(X), m_Value(Y))))) {
910+
bool FreezeY;
911+
if (match(FalseVal, m_c_Mul(m_Specific(X), m_Value(Y))) ||
912+
match(FalseVal, m_c_And(m_Specific(X), m_Value(Y))) ||
913+
match(FalseVal, m_FShl(m_Specific(X), m_Specific(X), m_Value(Y))) ||
914+
match(FalseVal, m_FShr(m_Specific(X), m_Specific(X), m_Value(Y))) ||
915+
match(FalseVal,
916+
m_c_Intrinsic<Intrinsic::umin>(m_Specific(X), m_Value(Y)))) {
917+
FreezeY = true;
918+
} else if (match(FalseVal, m_SDiv(m_Specific(X), m_Value(Y))) ||
919+
match(FalseVal, m_UDiv(m_Specific(X), m_Value(Y))) ||
920+
match(FalseVal, m_SRem(m_Specific(X), m_Value(Y))) ||
921+
match(FalseVal, m_URem(m_Specific(X), m_Value(Y)))) {
922+
FreezeY = false;
923+
} else {
916924
return nullptr;
917925
}
918926

@@ -925,13 +933,15 @@ static Instruction *foldSelectZeroOrFixedOp(SelectInst &SI,
925933
return nullptr;
926934

927935
auto *FalseValI = cast<Instruction>(FalseVal);
928-
auto *FrY = IC.InsertNewInstBefore(new FreezeInst(Y, Y->getName() + ".fr"),
929-
FalseValI->getIterator());
930-
IC.replaceOperand(*FalseValI,
931-
FalseValI->getOperand(0) == Y
932-
? 0
933-
: (FalseValI->getOperand(1) == Y ? 1 : 2),
934-
FrY);
936+
if (FreezeY) {
937+
auto *FrY = IC.InsertNewInstBefore(new FreezeInst(Y, Y->getName() + ".fr"),
938+
FalseValI->getIterator());
939+
IC.replaceOperand(*FalseValI,
940+
FalseValI->getOperand(0) == Y
941+
? 0
942+
: (FalseValI->getOperand(1) == Y ? 1 : 2),
943+
FrY);
944+
}
935945
return IC.replaceInstUsesWith(SI, FalseValI);
936946
}
937947

llvm/test/Transforms/InstCombine/select-fixed-zero.ll

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,8 @@ define i64 @fshr_select_no_combine(i64 %a, i64 %b, i64 %c) {
125125
; (select (icmp x, 0, eq), 0, (sdiv x, y)) -> (sdiv x, y)
126126
define i64 @sdiv_select(i64 %a, i64 %b) {
127127
; CHECK-LABEL: @sdiv_select(
128-
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
129-
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[A]], [[B_FR:%.*]]
130-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[DIV]]
131-
; CHECK-NEXT: ret i64 [[SELECT]]
128+
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[A:%.*]], [[B_FR:%.*]]
129+
; CHECK-NEXT: ret i64 [[DIV]]
132130
;
133131
%cond = icmp eq i64 %a, 0
134132
%div = sdiv i64 %a, %b
@@ -139,10 +137,8 @@ define i64 @sdiv_select(i64 %a, i64 %b) {
139137
; (select (icmp x, 0, eq), 0, (udiv x, y)) -> (udiv x, y)
140138
define i64 @udiv_select(i64 %a, i64 %b) {
141139
; CHECK-LABEL: @udiv_select(
142-
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
143-
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 [[A]], [[B_FR:%.*]]
144-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[DIV]]
145-
; CHECK-NEXT: ret i64 [[SELECT]]
140+
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 [[A:%.*]], [[B_FR:%.*]]
141+
; CHECK-NEXT: ret i64 [[DIV]]
146142
;
147143
%cond = icmp eq i64 %a, 0
148144
%div = udiv i64 %a, %b
@@ -153,10 +149,8 @@ define i64 @udiv_select(i64 %a, i64 %b) {
153149
; (select (icmp x, 0, eq), 0, (srem x, y)) -> (srem x, y)
154150
define i64 @srem_select(i64 %a, i64 %b) {
155151
; CHECK-LABEL: @srem_select(
156-
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
157-
; CHECK-NEXT: [[REM:%.*]] = srem i64 [[A]], [[B:%.*]]
158-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[REM]]
159-
; CHECK-NEXT: ret i64 [[SELECT]]
152+
; CHECK-NEXT: [[REM:%.*]] = srem i64 [[A:%.*]], [[B:%.*]]
153+
; CHECK-NEXT: ret i64 [[REM]]
160154
;
161155
%cond = icmp eq i64 %a, 0
162156
%rem = srem i64 %a, %b
@@ -167,10 +161,8 @@ define i64 @srem_select(i64 %a, i64 %b) {
167161
; (select (icmp x, 0, eq), 0, (urem x, y)) -> (urem x, y)
168162
define i64 @urem_select(i64 %a, i64 %b) {
169163
; CHECK-LABEL: @urem_select(
170-
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
171-
; CHECK-NEXT: [[REM:%.*]] = urem i64 [[A]], [[B:%.*]]
172-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[REM]]
173-
; CHECK-NEXT: ret i64 [[SELECT]]
164+
; CHECK-NEXT: [[REM:%.*]] = urem i64 [[A:%.*]], [[B:%.*]]
165+
; CHECK-NEXT: ret i64 [[REM]]
174166
;
175167
%cond = icmp eq i64 %a, 0
176168
%rem = urem i64 %a, %b

0 commit comments

Comments
 (0)