Convert the last uses of CastInst::createInferredCast to a normal cast
authorReid Spencer <rspencer@reidspencer.com>
Mon, 18 Dec 2006 08:47:13 +0000 (08:47 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Mon, 18 Dec 2006 08:47:13 +0000 (08:47 +0000)
creation. These changes are still temporary but at least this pushes
knowledge of signedness out closer to where it can be determined properly
and allows signedness to be removed from VMCore.

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

lib/CodeGen/IntrinsicLowering.cpp
lib/Transforms/ExprTypeConvert.cpp
lib/Transforms/Instrumentation/ProfilingUtils.cpp
lib/Transforms/Scalar/InstructionCombining.cpp

index f18d5f9a4f7e1c6fbe5e4ab02fb24f9646f2530a..b57b27252f294885e0a0965d683c86ce74904789 100644 (file)
@@ -66,9 +66,13 @@ static CallInst *ReplaceCallWith(const char *NewFn, CallInst *CI,
       if (castOpcodes[ArgNo])
         Arg = CastInst::create(Instruction::CastOps(castOpcodes[ArgNo]),
           Arg, FT->getParamType(ArgNo), Arg->getName(), CI);
-      else
-        Arg = CastInst::createInferredCast(Arg, FT->getParamType(ArgNo), 
-                                           Arg->getName(), CI);
+      else {
+        Instruction::CastOps opcode = CastInst::getCastOpcode(Arg, 
+            Arg->getType()->isSigned(), FT->getParamType(ArgNo), 
+            FT->getParamType(ArgNo)->isSigned());
+        Arg = CastInst::create(opcode, Arg, FT->getParamType(ArgNo),
+                               Arg->getName(), CI);
+      }
     Operands.push_back(Arg);
   }
   // Pass nulls into any additional arguments...
@@ -80,8 +84,12 @@ static CallInst *ReplaceCallWith(const char *NewFn, CallInst *CI,
   CallInst *NewCI = new CallInst(FCache, Operands, Name, CI);
   if (!CI->use_empty()) {
     Value *V = NewCI;
-    if (CI->getType() != NewCI->getType())
-      V = CastInst::createInferredCast(NewCI, CI->getType(), Name, CI);
+    if (CI->getType() != NewCI->getType()) {
+      Instruction::CastOps opcode = CastInst::getCastOpcode(NewCI, 
+          NewCI->getType()->isSigned(), CI->getType(), 
+          CI->getType()->isSigned());
+      V = CastInst::create(opcode, NewCI, CI->getType(), Name, CI);
+    }
     CI->replaceAllUsesWith(V);
   }
   return NewCI;
index 814318a587e27c01cb4ccb4da8325a301ec1823c..d59fb4db143154dc29afdc6bc99283400c866daa 100644 (file)
@@ -228,11 +228,14 @@ Value *llvm::ConvertExpressionToType(Value *V, const Type *Ty,
   Constant *Dummy = Constant::getNullValue(Ty);
 
   switch (I->getOpcode()) {
-  case Instruction::BitCast:
+  case Instruction::BitCast: {
     assert(VMC.NewCasts.count(ValueHandle(VMC, I)) == 0);
-    Res = CastInst::createInferredCast(I->getOperand(0), Ty, Name);
+    Instruction::CastOps opcode = CastInst::getCastOpcode(I->getOperand(0),
+        I->getOperand(0)->getType()->isSigned(), Ty, Ty->isSigned());
+    Res = CastInst::create(opcode, I->getOperand(0), Ty, Name);
     VMC.NewCasts.insert(ValueHandle(VMC, Res));
     break;
+  }
 
   case Instruction::Add:
   case Instruction::Sub:
@@ -706,9 +709,12 @@ static void ConvertOperandToType(User *U, Value *OldVal, Value *NewVal,
                   Constant::getNullValue(NewTy) : 0;
 
   switch (I->getOpcode()) {
-  case Instruction::BitCast:
-    Res = CastInst::createInferredCast(NewVal, I->getType(), Name);
+  case Instruction::BitCast: {
+    Instruction::CastOps opcode = CastInst::getCastOpcode(NewVal,
+        NewVal->getType()->isSigned(), I->getType(), I->getType()->isSigned());
+    Res = CastInst::create(opcode, NewVal, I->getType(), Name);
     break;
+  }
 
   case Instruction::Add:
   case Instruction::Sub:
index 274275a689baffafdc786092abdc14ccdf31b75e..4adf09e0999d7abb74eb472c1e07f38f5297dac9 100644 (file)
@@ -62,8 +62,10 @@ void llvm::InsertProfilingInitCall(Function *MainFn, const char *FnName,
   case 2:
     AI = MainFn->arg_begin(); ++AI;
     if (AI->getType() != ArgVTy) {
+      Instruction::CastOps opcode = CastInst::getCastOpcode(AI,
+          AI->getType()->isSigned(), ArgVTy, ArgVTy->isSigned());
       InitCall->setOperand(2, 
-          CastInst::createInferredCast(AI, ArgVTy, "argv.cast", InitCall));
+          CastInst::create(opcode, AI, ArgVTy, "argv.cast", InitCall));
     } else {
       InitCall->setOperand(2, AI);
     }
@@ -74,11 +76,18 @@ void llvm::InsertProfilingInitCall(Function *MainFn, const char *FnName,
     // If the program looked at argc, have it look at the return value of the
     // init call instead.
     if (AI->getType() != Type::IntTy) {
-      if (!AI->use_empty())
+      Instruction::CastOps opcode;
+      if (!AI->use_empty()) {
+        opcode = CastInst::getCastOpcode(InitCall, 
+            InitCall->getType()->isSigned(), AI->getType(), 
+            AI->getType()->isSigned());
         AI->replaceAllUsesWith(
-          CastInst::createInferredCast(InitCall, AI->getType(), "", InsertPos));
+          CastInst::create(opcode, InitCall, AI->getType(), "", InsertPos));
+      }
+      opcode = CastInst::getCastOpcode(AI, AI->getType()->isSigned(),
+          Type::IntTy, true);
       InitCall->setOperand(1, 
-          CastInst::createInferredCast(AI, Type::IntTy, "argc.cast", InitCall));
+          CastInst::create(opcode, AI, Type::IntTy, "argc.cast", InitCall));
     } else {
       AI->replaceAllUsesWith(InitCall);
       InitCall->setOperand(1, AI);
index c63bfcb8c233c5f209d4830943011594e4cec647..66c57a9bac844add47ae7621fdf6be38fa9b0bc1 100644 (file)
@@ -7009,7 +7009,9 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
     if ((*AI)->getType() == ParamTy) {
       Args.push_back(*AI);
     } else {
-      CastInst *NewCast = CastInst::createInferredCast(*AI, ParamTy, "tmp");
+      Instruction::CastOps opcode = CastInst::getCastOpcode(*AI,
+          (*AI)->getType()->isSigned(), ParamTy, ParamTy->isSigned());
+      CastInst *NewCast = CastInst::create(opcode, *AI, ParamTy, "tmp");
       Args.push_back(InsertNewInstBefore(NewCast, *Caller));
     }
   }
@@ -7030,7 +7032,9 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
         const Type *PTy = getPromotedType((*AI)->getType());
         if (PTy != (*AI)->getType()) {
           // Must promote to pass through va_arg area!
-          Instruction *Cast = CastInst::createInferredCast(*AI, PTy, "tmp");
+          Instruction::CastOps opcode = CastInst::getCastOpcode(
+              *AI, (*AI)->getType()->isSigned(), PTy, PTy->isSigned());
+          Instruction *Cast = CastInst::create(opcode, *AI, PTy, "tmp");
           InsertNewInstBefore(Cast, *Caller);
           Args.push_back(Cast);
         } else {
@@ -7058,7 +7062,10 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
   Value *NV = NC;
   if (Caller->getType() != NV->getType() && !Caller->use_empty()) {
     if (NV->getType() != Type::VoidTy) {
-      NV = NC = CastInst::createInferredCast(NC, Caller->getType(), "tmp");
+      const Type *CallerTy = Caller->getType();
+      Instruction::CastOps opcode = CastInst::getCastOpcode(
+          NC, NC->getType()->isSigned(), CallerTy, CallerTy->isSigned());
+      NV = NC = CastInst::create(opcode, NC, CallerTy, "tmp");
 
       // If this is an invoke instruction, we should insert it after the first
       // non-phi, instruction in the normal successor block.