Teach the DAGBuilder about lifetime markers which are generated from PHINodes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163494 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nadav Rotem 2012-09-10 08:43:23 +00:00
parent 2f9fc761d2
commit 9a2ae00c85
2 changed files with 59 additions and 20 deletions

View File

@ -5218,28 +5218,32 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
}
case Intrinsic::lifetime_start:
case Intrinsic::lifetime_end: {
// Stack coloring is not enabled in O0, discard region information.
if (TM.getOptLevel() == CodeGenOpt::None) {
if (Intrinsic == Intrinsic::lifetime_start)
setValue(&I, DAG.getUNDEF(TLI.getPointerTy()));
return 0;
}
SDValue Ops[2];
AllocaInst *LifetimeObject =dyn_cast_or_null<AllocaInst>(
GetUnderlyingObject(I.getArgOperand(1), TD));
// Could not find an Alloca.
if (!LifetimeObject)
return 0;
int FI = FuncInfo.StaticAllocaMap[LifetimeObject];
Ops[0] = getRoot();
Ops[1] = DAG.getFrameIndex(FI, TLI.getPointerTy(), true);
bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
unsigned Opcode = (IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END);
// Stack coloring is not enabled in O0, discard region information.
if (TM.getOptLevel() == CodeGenOpt::None)
return 0;
Res = DAG.getNode(Opcode, dl, MVT::Other, Ops, 2);
DAG.setRoot(Res);
return 0;
SmallVector<Value *, 4> Allocas;
GetUnderlyingObjects(I.getArgOperand(1), Allocas, TD);
for (SmallVector<Value*, 4>::iterator Object = Allocas.begin(),
E = Allocas.end(); Object != E; ++Object) {
AllocaInst *LifetimeObject = dyn_cast_or_null<AllocaInst>(*Object);
// Could not find an Alloca.
if (!LifetimeObject)
continue;
int FI = FuncInfo.StaticAllocaMap[LifetimeObject];
SDValue Ops[2];
Ops[0] = getRoot();
Ops[1] = DAG.getFrameIndex(FI, TLI.getPointerTy(), true);
unsigned Opcode = (IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END);
Res = DAG.getNode(Opcode, dl, MVT::Other, Ops, 2);
DAG.setRoot(Res);
}
}
case Intrinsic::invariant_start:
// Discard region information.

View File

@ -262,6 +262,41 @@ entry:
ret void
}
;YESCOLOR: subq $272, %rsp
;NOCOLOR: subq $272, %rsp
define i32 @func_phi_lifetime(i32 %in, i1 %d) {
entry:
%a = alloca [17 x i8*], align 8
%a2 = alloca [16 x i8*], align 8
%b = bitcast [17 x i8*]* %a to i8*
%b2 = bitcast [16 x i8*]* %a2 to i8*
%t1 = call i32 @foo(i32 %in, i8* %b)
%t2 = call i32 @foo(i32 %in, i8* %b)
call void @llvm.lifetime.end(i64 -1, i8* %b)
br i1 %d, label %bb0, label %bb1
bb0:
%I1 = bitcast [17 x i8*]* %a to i8*
br label %bb2
bb1:
%I2 = bitcast [16 x i8*]* %a2 to i8*
br label %bb2
bb2:
%split = phi i8* [ %I1, %bb0 ], [ %I2, %bb1 ]
call void @llvm.lifetime.start(i64 -1, i8* %split)
%t3 = call i32 @foo(i32 %in, i8* %b2)
%t4 = call i32 @foo(i32 %in, i8* %b2)
%t5 = add i32 %t1, %t2
%t6 = add i32 %t3, %t4
%t7 = add i32 %t5, %t6
call void @llvm.lifetime.end(i64 -1, i8* %split)
ret i32 %t7
bb3:
ret i32 0
}
declare void @bar([100 x i32]* , [100 x i32]*) nounwind
declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind