Skip to content

Commit

Permalink
Unify the lowering of arguments during SjLj prepare.
Browse files Browse the repository at this point in the history
The 'select true, %arg, undef' instruction can be used for both aggregate and
non-aggregate arguments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212967 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
isanbard committed Jul 14, 2014
1 parent 9cfe4c2 commit e31c059
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 29 deletions.
38 changes: 10 additions & 28 deletions lib/CodeGen/SjLjEHPrepare.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down
2 changes: 1 addition & 1 deletion test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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]*}}:
Expand Down

0 comments on commit e31c059

Please sign in to comment.