summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2014-07-14 18:21:11 +0000
committerBill Wendling <isanbard@gmail.com>2014-07-14 18:21:11 +0000
commitc80b6c92e28802e5651a896fbf79fc657142424b (patch)
treeeb451572dec65772179f0c57c4661a9f38fe20b7 /llvm/lib/CodeGen
parentb49bf168f25b9500cae0992373dca30f040e6313 (diff)
downloadbcm5719-llvm-c80b6c92e28802e5651a896fbf79fc657142424b.tar.gz
bcm5719-llvm-c80b6c92e28802e5651a896fbf79fc657142424b.zip
Unify the lowering of arguments during SjLj prepare.
The 'select true, %arg, undef' instruction can be used for both aggregate and non-aggregate arguments. llvm-svn: 212967
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SjLjEHPrepare.cpp38
1 files changed, 10 insertions, 28 deletions
diff --git a/llvm/lib/CodeGen/SjLjEHPrepare.cpp b/llvm/lib/CodeGen/SjLjEHPrepare.cpp
index f53408a0f12..b0950ded270 100644
--- a/llvm/lib/CodeGen/SjLjEHPrepare.cpp
+++ b/llvm/lib/CodeGen/SjLjEHPrepare.cpp
@@ -249,34 +249,16 @@ void SjLjEHPrepare::lowerIncomingArguments(Function &F) {
++AI) {
Type *Ty = AI->getType();
- if (isa<StructType>(Ty) || isa<ArrayType>(Ty)) {
- // Aggregate types can't be cast, but are legal argument types,
- // so we have to handle them differently. We use
- // select i8 true, %arg, undef to achieve the same goal
- Value *TrueValue = ConstantInt::getTrue(F.getContext());
- Value *UndefValue = UndefValue::get(Ty);
- Instruction *SI = SelectInst::Create(TrueValue, AI, UndefValue,
- AI->getName() + ".tmp",
- AfterAllocaInsPt);
- AI->replaceAllUsesWith(SI);
-
- SI->setOperand(1, AI);
- } else {
- // This is always a no-op cast because we're casting AI to AI->getType()
- // so src and destination types are identical. BitCast is the only
- // possibility.
- CastInst *NC = new BitCastInst(AI, AI->getType(), AI->getName() + ".tmp",
- AfterAllocaInsPt);
- AI->replaceAllUsesWith(NC);
-
- // Set the operand of the cast instruction back to the AllocaInst.
- // Normally it's forbidden to replace a CastInst's operand because it
- // could cause the opcode to reflect an illegal conversion. However, we're
- // replacing it here with the same value it was constructed with. We do
- // this because the above replaceAllUsesWith() clobbered the operand, but
- // we want this one to remain.
- NC->setOperand(0, AI);
- }
+ // Use 'select i8 true, %arg, undef' to simulate a 'no-op' instruction.
+ Value *TrueValue = ConstantInt::getTrue(F.getContext());
+ Value *UndefValue = UndefValue::get(Ty);
+ Instruction *SI = SelectInst::Create(TrueValue, AI, UndefValue,
+ AI->getName() + ".tmp",
+ AfterAllocaInsPt);
+ AI->replaceAllUsesWith(SI);
+
+ // Reset the operand, because it was clobbered by the RAUW above.
+ SI->setOperand(1, AI);
}
}
OpenPOWER on IntegriCloud