[Statepoints] Clean up PlaceSafepoints.cpp: de-duplicate code.
authorSanjoy Das <sanjoy@playingwithpointers.com>
Wed, 6 May 2015 23:53:21 +0000 (23:53 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Wed, 6 May 2015 23:53:21 +0000 (23:53 +0000)
Common duplicated code and remove unnecessary code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236674 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/PlaceSafepoints.cpp

index b68a09fea14c52cb576de11b0852d911a8445552..016591d85c20256521b4083e09f5f9e682180d2c 100644 (file)
@@ -889,7 +889,8 @@ static Value *ReplaceWithStatepoint(const CallSite &CS, /* to replace */
 
   // Create the statepoint given all the arguments
   Instruction *Token = nullptr;
-  AttributeSet ReturnAttrs;
+  AttributeSet OriginalAttrs;
+
   if (CS.isCall()) {
     CallInst *ToReplace = cast<CallInst>(CS.getInstruction());
     CallInst *Call = Builder.CreateGCStatepointCall(
@@ -899,24 +900,21 @@ static Value *ReplaceWithStatepoint(const CallSite &CS, /* to replace */
     Call->setCallingConv(ToReplace->getCallingConv());
 
     // Before we have to worry about GC semantics, all attributes are legal
-    AttributeSet OriginalAttrs = ToReplace->getAttributes();
-    // In case if we can handle this set of sttributes - set up function attrs
-    // directly on statepoint and return attrs later for gc_result intrinsic.
-    Call->setAttributes(OriginalAttrs.getFnAttributes());
-    ReturnAttrs = OriginalAttrs.getRetAttributes();
     // TODO: handle param attributes
+    OriginalAttrs = ToReplace->getAttributes();
+
+    // In case if we can handle this set of attributes - set up function
+    // attributes directly on statepoint and return attributes later for
+    // gc_result intrinsic.
+    Call->setAttributes(OriginalAttrs.getFnAttributes());
 
     Token = Call;
 
     // Put the following gc_result and gc_relocate calls immediately after the
-    // the old call (which we're about to delete)
-    BasicBlock::iterator next(ToReplace);
-    assert(BB->end() != next && "not a terminator, must have next");
-    next++;
-    Instruction *IP = &*(next);
-    Builder.SetInsertPoint(IP);
-    Builder.SetCurrentDebugLocation(IP->getDebugLoc());
-
+    // the old call (which we're about to delete).
+    assert(ToReplace->getNextNode() && "not a terminator, must have next");
+    Builder.SetInsertPoint(ToReplace->getNextNode());
+    Builder.SetCurrentDebugLocation(ToReplace->getNextNode()->getDebugLoc());
   } else if (CS.isInvoke()) {
     InvokeInst *ToReplace = cast<InvokeInst>(CS.getInstruction());
 
@@ -931,19 +929,19 @@ static Value *ReplaceWithStatepoint(const CallSite &CS, /* to replace */
 
     // Currently we will fail on parameter attributes and on certain
     // function attributes.
-    AttributeSet OriginalAttrs = ToReplace->getAttributes();
-    // In case if we can handle this set of sttributes - set up function attrs
-    // directly on statepoint and return attrs later for gc_result intrinsic.
+    OriginalAttrs = ToReplace->getAttributes();
+
+    // In case if we can handle this set of attributes - set up function
+    // attributes directly on statepoint and return attributes later for
+    // gc_result intrinsic.
     Invoke->setAttributes(OriginalAttrs.getFnAttributes());
-    ReturnAttrs = OriginalAttrs.getRetAttributes();
 
     Token = Invoke;
 
     // We'll insert the gc.result into the normal block
     BasicBlock *NormalDest = normalizeBBForInvokeSafepoint(
         ToReplace->getNormalDest(), Invoke->getParent());
-    Instruction *IP = &*(NormalDest->getFirstInsertionPt());
-    Builder.SetInsertPoint(IP);
+    Builder.SetInsertPoint(NormalDest->getFirstInsertionPt());
   } else {
     llvm_unreachable("unexpect type of CallSite");
   }
@@ -957,7 +955,7 @@ static Value *ReplaceWithStatepoint(const CallSite &CS, /* to replace */
     std::string TakenName =
         CS.getInstruction()->hasName() ? CS.getInstruction()->getName() : "";
     CallInst *GCResult = Builder.CreateGCResult(Token, CS.getType(), TakenName);
-    GCResult->setAttributes(ReturnAttrs);
+    GCResult->setAttributes(OriginalAttrs.getRetAttributes());
     return GCResult;
   } else {
     // No return value for the call.