@@ -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