Two fixes:
authorChris Lattner <sabre@nondot.org>
Sun, 8 Aug 2004 01:30:07 +0000 (01:30 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 8 Aug 2004 01:30:07 +0000 (01:30 +0000)
1. Fix a REALLY nasty cyclic replacement issue that Anshu discovered, causing
   nondeterminstic crashes and memory corruption.
2. For performance, don't go inserting constantexpr casts of GV pointers.

This should definitely go into 1.3

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15568 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/ExprTypeConvert.cpp

index 0f80c2f8bb223fd34a769ca8a2376c7d194abc0c..a657f023df49a7e5e02914b94e40f38752c8488e 100644 (file)
@@ -151,7 +151,7 @@ bool llvm::ExpressionConvertibleToType(Value *V, const Type *Ty,
   // If it's a constant... all constants can be converted to a different
   // type.
   //
-  if (Constant *CPV = dyn_cast<Constant>(V))
+  if (isa<Constant>(V) && !isa<GlobalValue>(V))
     return true;
   
   CTMap[V] = Ty;
@@ -984,10 +984,9 @@ static void ConvertOperandToType(User *U, Value *OldVal, Value *NewVal,
 
     unsigned OtherIdx = (OldVal == I->getOperand(0)) ? 1 : 0;
     Value *OtherOp    = I->getOperand(OtherIdx);
+    Res->setOperand(!OtherIdx, NewVal);
     Value *NewOther   = ConvertExpressionToType(OtherOp, NewTy, VMC, TD);
-
     Res->setOperand(OtherIdx, NewOther);
-    Res->setOperand(!OtherIdx, NewVal);
     break;
   }
   case Instruction::Shl: