1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

[IR] Simplify createReplacementInstr

NFCI, although the test change shows that ConstantExpr::getAsInstruction
is better than the old implementation of createReplacementInstr because
it propagates things like the sdiv "exact" flag.

Differential Revision: https://reviews.llvm.org/D104124
This commit is contained in:
Jay Foad 2021-06-11 16:36:30 +01:00
parent 5b47031c00
commit 7fc0f10d11

View File

@ -20,53 +20,9 @@ namespace llvm {
// Replace a constant expression by instructions with equivalent operations at // Replace a constant expression by instructions with equivalent operations at
// a specified location. // a specified location.
Instruction *createReplacementInstr(ConstantExpr *CE, Instruction *Instr) { Instruction *createReplacementInstr(ConstantExpr *CE, Instruction *Instr) {
IRBuilder<NoFolder> Builder(Instr); auto *CEInstr = CE->getAsInstruction();
unsigned OpCode = CE->getOpcode(); CEInstr->insertBefore(Instr);
switch (OpCode) { return CEInstr;
case Instruction::GetElementPtr: {
SmallVector<Value *, 4> CEOpVec(CE->operands());
ArrayRef<Value *> CEOps(CEOpVec);
return dyn_cast<Instruction>(
Builder.CreateInBoundsGEP(cast<GEPOperator>(CE)->getSourceElementType(),
CEOps[0], CEOps.slice(1)));
}
case Instruction::Add:
case Instruction::Sub:
case Instruction::Mul:
case Instruction::UDiv:
case Instruction::SDiv:
case Instruction::FDiv:
case Instruction::URem:
case Instruction::SRem:
case Instruction::FRem:
case Instruction::Shl:
case Instruction::LShr:
case Instruction::AShr:
case Instruction::And:
case Instruction::Or:
case Instruction::Xor:
return dyn_cast<Instruction>(
Builder.CreateBinOp((Instruction::BinaryOps)OpCode, CE->getOperand(0),
CE->getOperand(1), CE->getName()));
case Instruction::Trunc:
case Instruction::ZExt:
case Instruction::SExt:
case Instruction::FPToUI:
case Instruction::FPToSI:
case Instruction::UIToFP:
case Instruction::SIToFP:
case Instruction::FPTrunc:
case Instruction::FPExt:
case Instruction::PtrToInt:
case Instruction::IntToPtr:
case Instruction::BitCast:
case Instruction::AddrSpaceCast:
return dyn_cast<Instruction>(
Builder.CreateCast((Instruction::CastOps)OpCode, CE->getOperand(0),
CE->getType(), CE->getName()));
default:
llvm_unreachable("Unhandled constant expression!\n");
}
} }
void convertConstantExprsToInstructions(Instruction *I, ConstantExpr *CE, void convertConstantExprsToInstructions(Instruction *I, ConstantExpr *CE,