@@ -166,7 +166,9 @@ static Value *foldMulShl1(BinaryOperator &Mul, bool CommuteOperands,
166
166
if (match (Y, m_OneUse (m_Add (m_BinOp (Shift), m_One ()))) &&
167
167
match (Shift, m_OneUse (m_Shl (m_One (), m_Value (Z))))) {
168
168
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" );
170
172
Value *Shl = Builder.CreateShl (FrX, Z, " mulshl" , HasNUW, PropagateNSW);
171
173
return Builder.CreateAdd (Shl, FrX, Mul.getName (), HasNUW, PropagateNSW);
172
174
}
@@ -177,7 +179,9 @@ static Value *foldMulShl1(BinaryOperator &Mul, bool CommuteOperands,
177
179
// This increases uses of X, so it may require a freeze, but that is still
178
180
// expected to be an improvement because it removes the multiply.
179
181
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" );
181
185
Value *Shl = Builder.CreateShl (FrX, Z, " mulshl" );
182
186
return Builder.CreateSub (Shl, FrX, Mul.getName ());
183
187
}
@@ -414,7 +418,9 @@ Instruction *InstCombinerImpl::visitMul(BinaryOperator &I) {
414
418
auto RemOpc = Div->getOpcode () == Instruction::UDiv ? Instruction::URem
415
419
: Instruction::SRem;
416
420
// 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" );
418
424
Value *Rem = Builder.CreateBinOp (RemOpc, XFreeze, DivOp1);
419
425
if (DivOp1 == Y)
420
426
return BinaryOperator::CreateSub (XFreeze, Rem);
@@ -1274,7 +1280,9 @@ Instruction *InstCombinerImpl::commonIDivTransforms(BinaryOperator &I) {
1274
1280
// 1 / 0 --> undef ; 1 / 1 --> 1 ; 1 / -1 --> -1 ; 1 / anything else --> 0
1275
1281
// (Op1 + 1) u< 3 ? Op1 : 0
1276
1282
// 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" );
1278
1286
Value *Inc = Builder.CreateAdd (F1, Op0);
1279
1287
Value *Cmp = Builder.CreateICmpULT (Inc, ConstantInt::get (Ty, 3 ));
1280
1288
return SelectInst::Create (Cmp, F1, ConstantInt::get (Ty, 0 ));
@@ -2187,7 +2195,9 @@ Instruction *InstCombinerImpl::visitURem(BinaryOperator &I) {
2187
2195
// Op0 urem C -> Op0 < C ? Op0 : Op0 - C, where C >= signbit.
2188
2196
// Op0 must be frozen because we are increasing its number of uses.
2189
2197
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" );
2191
2201
Value *Cmp = Builder.CreateICmpULT (F0, Op1);
2192
2202
Value *Sub = Builder.CreateSub (F0, Op1);
2193
2203
return SelectInst::Create (Cmp, F0, Sub);
@@ -2199,7 +2209,9 @@ Instruction *InstCombinerImpl::visitURem(BinaryOperator &I) {
2199
2209
// urem Op0, (sext i1 X) --> (Op0 == -1) ? 0 : Op0
2200
2210
Value *X;
2201
2211
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" );
2203
2215
Value *Cmp =
2204
2216
Builder.CreateICmpEQ (FrozenOp0, ConstantInt::getAllOnesValue (Ty));
2205
2217
return SelectInst::Create (Cmp, ConstantInt::getNullValue (Ty), FrozenOp0);
@@ -2210,7 +2222,9 @@ Instruction *InstCombinerImpl::visitURem(BinaryOperator &I) {
2210
2222
Value *Val =
2211
2223
simplifyICmpInst (ICmpInst::ICMP_ULT, X, Op1, SQ.getWithInstruction (&I));
2212
2224
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" );
2214
2228
Value *Cmp = Builder.CreateICmpEQ (FrozenOp0, Op1);
2215
2229
return SelectInst::Create (Cmp, ConstantInt::getNullValue (Ty), FrozenOp0);
2216
2230
}
0 commit comments