Clean up some code around the store V, (cast P) -> store (cast V), P
authorReid Spencer <rspencer@reidspencer.com>
Thu, 18 Jan 2007 18:54:33 +0000 (18:54 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Thu, 18 Jan 2007 18:54:33 +0000 (18:54 +0000)
transform. Change some variable names so it is clear what is source and
what is dest of the cast. Also, add an assert to ensure that the integer
to integer case is asserting if the bitwidths are different. This prevents
illegal casts from being formed and catches bitwidth bugs sooner.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index f81f10e71e1e15df6a70e071ab85c88915d7f22f..48eaef59e72c985fa79d64eb8597bc3a10f67f1a 100644 (file)
@@ -8186,23 +8186,29 @@ static Instruction *InstCombineStoreToCast(InstCombiner &IC, StoreInst &SI) {
                IC.getTargetData().getTypeSize(DestPTy)) {
 
         // Okay, we are casting from one integer or pointer type to another of
-        // the same size.  Instead of casting the pointer before the store, cast
-        // the value to be stored.
+        // the same size.  Instead of casting the pointer before 
+        // the store, cast the value to be stored.
         Value *NewCast;
-        Instruction::CastOps opcode = Instruction::BitCast;
         Value *SIOp0 = SI.getOperand(0);
-        if (isa<PointerType>(SrcPTy)) {
-          if (SIOp0->getType()->isInteger())
+        Instruction::CastOps opcode = Instruction::BitCast;
+        const Type* CastSrcTy = SIOp0->getType();
+        const Type* CastDstTy = SrcPTy;
+        if (isa<PointerType>(CastDstTy)) {
+          if (CastSrcTy->isInteger())
             opcode = Instruction::IntToPtr;
-        } else if (SrcPTy->isInteger()) {
+        } else if (const IntegerType* DITy = dyn_cast<IntegerType>(CastDstTy)) {
           if (isa<PointerType>(SIOp0->getType()))
             opcode = Instruction::PtrToInt;
+          else if (const IntegerType* SITy = dyn_cast<IntegerType>(CastSrcTy))
+            assert(DITy->getBitWidth() == SITy->getBitWidth() &&
+                   "Illegal store instruction");
         }
         if (Constant *C = dyn_cast<Constant>(SIOp0))
-          NewCast = ConstantExpr::getCast(opcode, C, SrcPTy);
+          NewCast = ConstantExpr::getCast(opcode, C, CastDstTy);
         else
           NewCast = IC.InsertNewInstBefore(
-            CastInst::create(opcode, SIOp0, SrcPTy, SIOp0->getName()+".c"), SI);
+            CastInst::create(opcode, SIOp0, CastDstTy, SIOp0->getName()+".c"), 
+            SI);
         return new StoreInst(NewCast, CastOp);
       }
     }