Skip to content

Commit 60e90a1

Browse files
authored
[InstCombine] Check for undef first before freeze (#96769)
All of these insert freeze due to multi-use, which is only relevant for undef values, not poison.
1 parent 949bbdc commit 60e90a1

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,9 @@ static Value *foldMulShl1(BinaryOperator &Mul, bool CommuteOperands,
166166
if (match(Y, m_OneUse(m_Add(m_BinOp(Shift), m_One()))) &&
167167
match(Shift, m_OneUse(m_Shl(m_One(), m_Value(Z))))) {
168168
bool PropagateNSW = HasNSW && Shift->hasNoSignedWrap();
169-
Value *FrX = Builder.CreateFreeze(X, X->getName() + ".fr");
169+
Value *FrX = X;
170+
if (!isGuaranteedNotToBeUndef(X))
171+
FrX = Builder.CreateFreeze(X, X->getName() + ".fr");
170172
Value *Shl = Builder.CreateShl(FrX, Z, "mulshl", HasNUW, PropagateNSW);
171173
return Builder.CreateAdd(Shl, FrX, Mul.getName(), HasNUW, PropagateNSW);
172174
}
@@ -177,7 +179,9 @@ static Value *foldMulShl1(BinaryOperator &Mul, bool CommuteOperands,
177179
// This increases uses of X, so it may require a freeze, but that is still
178180
// expected to be an improvement because it removes the multiply.
179181
if (match(Y, m_OneUse(m_Not(m_OneUse(m_Shl(m_AllOnes(), m_Value(Z))))))) {
180-
Value *FrX = Builder.CreateFreeze(X, X->getName() + ".fr");
182+
Value *FrX = X;
183+
if (!isGuaranteedNotToBeUndef(X))
184+
FrX = Builder.CreateFreeze(X, X->getName() + ".fr");
181185
Value *Shl = Builder.CreateShl(FrX, Z, "mulshl");
182186
return Builder.CreateSub(Shl, FrX, Mul.getName());
183187
}
@@ -414,7 +418,9 @@ Instruction *InstCombinerImpl::visitMul(BinaryOperator &I) {
414418
auto RemOpc = Div->getOpcode() == Instruction::UDiv ? Instruction::URem
415419
: Instruction::SRem;
416420
// X must be frozen because we are increasing its number of uses.
417-
Value *XFreeze = Builder.CreateFreeze(X, X->getName() + ".fr");
421+
Value *XFreeze = X;
422+
if (!isGuaranteedNotToBeUndef(X))
423+
XFreeze = Builder.CreateFreeze(X, X->getName() + ".fr");
418424
Value *Rem = Builder.CreateBinOp(RemOpc, XFreeze, DivOp1);
419425
if (DivOp1 == Y)
420426
return BinaryOperator::CreateSub(XFreeze, Rem);
@@ -1274,7 +1280,9 @@ Instruction *InstCombinerImpl::commonIDivTransforms(BinaryOperator &I) {
12741280
// 1 / 0 --> undef ; 1 / 1 --> 1 ; 1 / -1 --> -1 ; 1 / anything else --> 0
12751281
// (Op1 + 1) u< 3 ? Op1 : 0
12761282
// Op1 must be frozen because we are increasing its number of uses.
1277-
Value *F1 = Builder.CreateFreeze(Op1, Op1->getName() + ".fr");
1283+
Value *F1 = Op1;
1284+
if (!isGuaranteedNotToBeUndef(Op1))
1285+
F1 = Builder.CreateFreeze(Op1, Op1->getName() + ".fr");
12781286
Value *Inc = Builder.CreateAdd(F1, Op0);
12791287
Value *Cmp = Builder.CreateICmpULT(Inc, ConstantInt::get(Ty, 3));
12801288
return SelectInst::Create(Cmp, F1, ConstantInt::get(Ty, 0));
@@ -2187,7 +2195,9 @@ Instruction *InstCombinerImpl::visitURem(BinaryOperator &I) {
21872195
// Op0 urem C -> Op0 < C ? Op0 : Op0 - C, where C >= signbit.
21882196
// Op0 must be frozen because we are increasing its number of uses.
21892197
if (match(Op1, m_Negative())) {
2190-
Value *F0 = Builder.CreateFreeze(Op0, Op0->getName() + ".fr");
2198+
Value *F0 = Op0;
2199+
if (!isGuaranteedNotToBeUndef(Op0))
2200+
F0 = Builder.CreateFreeze(Op0, Op0->getName() + ".fr");
21912201
Value *Cmp = Builder.CreateICmpULT(F0, Op1);
21922202
Value *Sub = Builder.CreateSub(F0, Op1);
21932203
return SelectInst::Create(Cmp, F0, Sub);
@@ -2199,7 +2209,9 @@ Instruction *InstCombinerImpl::visitURem(BinaryOperator &I) {
21992209
// urem Op0, (sext i1 X) --> (Op0 == -1) ? 0 : Op0
22002210
Value *X;
22012211
if (match(Op1, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1)) {
2202-
Value *FrozenOp0 = Builder.CreateFreeze(Op0, Op0->getName() + ".frozen");
2212+
Value *FrozenOp0 = Op0;
2213+
if (!isGuaranteedNotToBeUndef(Op0))
2214+
FrozenOp0 = Builder.CreateFreeze(Op0, Op0->getName() + ".frozen");
22032215
Value *Cmp =
22042216
Builder.CreateICmpEQ(FrozenOp0, ConstantInt::getAllOnesValue(Ty));
22052217
return SelectInst::Create(Cmp, ConstantInt::getNullValue(Ty), FrozenOp0);
@@ -2210,7 +2222,9 @@ Instruction *InstCombinerImpl::visitURem(BinaryOperator &I) {
22102222
Value *Val =
22112223
simplifyICmpInst(ICmpInst::ICMP_ULT, X, Op1, SQ.getWithInstruction(&I));
22122224
if (Val && match(Val, m_One())) {
2213-
Value *FrozenOp0 = Builder.CreateFreeze(Op0, Op0->getName() + ".frozen");
2225+
Value *FrozenOp0 = Op0;
2226+
if (!isGuaranteedNotToBeUndef(Op0))
2227+
FrozenOp0 = Builder.CreateFreeze(Op0, Op0->getName() + ".frozen");
22142228
Value *Cmp = Builder.CreateICmpEQ(FrozenOp0, Op1);
22152229
return SelectInst::Create(Cmp, ConstantInt::getNullValue(Ty), FrozenOp0);
22162230
}

0 commit comments

Comments
 (0)