[llvm] r212967 - Unify the lowering of arguments during SjLj prepare.
Bill Wendling
isanbard at gmail.com
Mon Jul 14 11:21:12 PDT 2014
Author: void
Date: Mon Jul 14 13:21:11 2014
New Revision: 212967
URL: http://llvm.org/viewvc/llvm-project?rev=212967&view=rev
Log:
Unify the lowering of arguments during SjLj prepare.
The 'select true, %arg, undef' instruction can be used for both aggregate and
non-aggregate arguments.
Modified:
llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp
llvm/trunk/test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll
Modified: llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp?rev=212967&r1=212966&r2=212967&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp (original)
+++ llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp Mon Jul 14 13:21:11 2014
@@ -249,34 +249,16 @@ void SjLjEHPrepare::lowerIncomingArgumen
++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);
+ // 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);
- 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);
- }
+ // Reset the operand, because it was clobbered by the RAUW above.
+ SI->setOperand(1, AI);
}
}
Modified: llvm/trunk/test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll?rev=212967&r1=212966&r2=212967&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll Mon Jul 14 13:21:11 2014
@@ -10,7 +10,7 @@
; __Unwind_SjLj_Register and actual @bar invocation
-define i8* @foo({} %c) {
+define i8* @foo(i8 %a, {} %c) {
entry:
; CHECK: bl __Unwind_SjLj_Register
; CHECK-NEXT: {{[A-Z][a-zA-Z0-9]*}}:
More information about the llvm-commits
mailing list