Convert the last uses of CastInst::createInferredCast to a normal cast

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.

llvm-svn: 32654
This commit is contained in:
Reid Spencer 2006-12-18 08:47:13 +00:00
parent 4800c38a75
commit 668d90f289
4 changed files with 46 additions and 16 deletions

View 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;

View 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:

View 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);

View 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.