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
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 1eb251d..483b051 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -5218,28 +5218,32 @@
   }
   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.