<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 1, 2015 at 7:53 PM, Sanjoy Das <span dir="ltr"><<a href="mailto:sanjoy@playingwithpointers.com" target="_blank">sanjoy@playingwithpointers.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: sanjoy<br>
Date: Wed Jul  1 21:53:36 2015<br>
New Revision: 241232<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241232-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=3wIw-HELRYGHBgC5FSkIKyJBnqBybJLJLK9vaY0_Z80&s=qEQ-ygUXVq-OsyRG_dhfQdydSx4PSq93zZQfeU3saHY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=241232&view=rev</a><br>
Log:<br>
[Statepoints][NFC] Add Statepoint::operator bool()<br>
<br>
Summary:<br>
This allows the "if (Statepoint SP = Statepoint(I))" idiom.<br>
<br>
(I don't think this change needs review, this was uploaded to<br>
phabricator to provide context for later dependent changes.)<br>
<br>
Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D10629&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=3wIw-HELRYGHBgC5FSkIKyJBnqBybJLJLK9vaY0_Z80&s=3Jm6OzeY-D8Zowk7OOLE-2SSxqZaWh4BxyzikxT5mcc&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D10629</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/IR/Statepoint.h<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Statepoint.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_IR_Statepoint.h-3Frev-3D241232-26r1-3D241231-26r2-3D241232-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=3wIw-HELRYGHBgC5FSkIKyJBnqBybJLJLK9vaY0_Z80&s=uK--02x_Hfv-Ho1651GaGFAt6KPmuts7O6tuD5M_1rU&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Statepoint.h?rev=241232&r1=241231&r2=241232&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Statepoint.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Statepoint.h Wed Jul  1 21:53:36 2015<br>
@@ -54,8 +54,6 @@ bool isGCResult(const ImmutableCallSite<br>
 /// concrete subtypes.  This is structured analogous to CallSite<br>
 /// rather than the IntrinsicInst.h helpers since we want to support<br>
 /// invokable statepoints in the near future.<br>
-/// TODO: This does not currently allow the if(Statepoint S = ...)<br>
-///   idiom used with CallSites.  Consider refactoring to support.<br>
 template <typename InstructionTy, typename ValueTy, typename CallSiteTy><br>
 class StatepointBase {<br>
   CallSiteTy StatepointCS;<br>
@@ -63,11 +61,15 @@ class StatepointBase {<br>
   void *operator new(size_t s) = delete;<br>
<br>
 protected:<br>
-  explicit StatepointBase(InstructionTy *I) : StatepointCS(I) {<br>
-    assert(isStatepoint(I));<br>
-  }<br>
-  explicit StatepointBase(CallSiteTy CS) : StatepointCS(CS) {<br>
-    assert(isStatepoint(CS));<br>
+  explicit StatepointBase(InstructionTy *I) {<br>
+    if (isStatepoint(I)) {<br>
+      StatepointCS = CallSiteTy(I);<br>
+      assert(StatepointCS && "isStatepoint implies CallSite");<br>
+    }<br>
+  }<br>
+  explicit StatepointBase(CallSiteTy CS) {<br>
+    if (isStatepoint(CS))<br>
+      StatepointCS = CS;<br>
   }<br>
<br>
 public:<br>
@@ -82,23 +84,31 @@ public:<br>
     CallArgsBeginPos = 5,<br>
   };<br>
<br>
+  operator bool() const {<br></blockquote><div><br>op bool should pretty much always be explicit - we have LLVM_EXPLICIT for this, I think (unless our support matrix already covers explicit conversion operators now? I forget)<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    // We do not assign non-statepoint CallSites to StatepointCS.<br>
+    return (bool)StatepointCS;<br>
+  }<br>
+<br>
   /// Return the underlying CallSite.<br>
-  CallSiteTy getCallSite() { return StatepointCS; }<br>
+  CallSiteTy getCallSite() const {<br>
+    assert(*this && "check validity first!");<br>
+    return StatepointCS;<br>
+  }<br>
<br>
   uint64_t getFlags() const {<br>
-    return cast<ConstantInt>(StatepointCS.getArgument(FlagsPos))<br>
+    return cast<ConstantInt>(getCallSite().getArgument(FlagsPos))<br>
         ->getZExtValue();<br>
   }<br>
<br>
   /// Return the ID associated with this statepoint.<br>
   uint64_t getID() {<br>
-    const Value *IDVal = StatepointCS.getArgument(IDPos);<br>
+    const Value *IDVal = getCallSite().getArgument(IDPos);<br>
     return cast<ConstantInt>(IDVal)->getZExtValue();<br>
   }<br>
<br>
   /// Return the number of patchable bytes associated with this statepoint.<br>
   uint32_t getNumPatchBytes() {<br>
-    const Value *NumPatchBytesVal = StatepointCS.getArgument(NumPatchBytesPos);<br>
+    const Value *NumPatchBytesVal = getCallSite().getArgument(NumPatchBytesPos);<br>
     uint64_t NumPatchBytes =<br>
       cast<ConstantInt>(NumPatchBytesVal)->getZExtValue();<br>
     assert(isInt<32>(NumPatchBytes) && "should fit in 32 bits!");<br>
@@ -107,7 +117,7 @@ public:<br>
<br>
   /// Return the value actually being called or invoked.<br>
   ValueTy *getActualCallee() {<br>
-    return StatepointCS.getArgument(ActualCalleePos);<br>
+    return getCallSite().getArgument(ActualCalleePos);<br>
   }<br>
<br>
   /// Return the type of the value returned by the call underlying the<br>
@@ -120,17 +130,17 @@ public:<br>
<br>
   /// Number of arguments to be passed to the actual callee.<br>
   int getNumCallArgs() {<br>
-    const Value *NumCallArgsVal = StatepointCS.getArgument(NumCallArgsPos);<br>
+    const Value *NumCallArgsVal = getCallSite().getArgument(NumCallArgsPos);<br>
     return cast<ConstantInt>(NumCallArgsVal)->getZExtValue();<br>
   }<br>
<br>
   typename CallSiteTy::arg_iterator call_args_begin() {<br>
-    assert(CallArgsBeginPos <= (int)StatepointCS.arg_size());<br>
-    return StatepointCS.arg_begin() + CallArgsBeginPos;<br>
+    assert(CallArgsBeginPos <= (int)getCallSite().arg_size());<br>
+    return getCallSite().arg_begin() + CallArgsBeginPos;<br>
   }<br>
   typename CallSiteTy::arg_iterator call_args_end() {<br>
     auto I = call_args_begin() + getNumCallArgs();<br>
-    assert((StatepointCS.arg_end() - I) >= 0);<br>
+    assert((getCallSite().arg_end() - I) >= 0);<br>
     return I;<br>
   }<br>
<br>
@@ -146,12 +156,12 @@ public:<br>
   }<br>
   typename CallSiteTy::arg_iterator gc_transition_args_begin() {<br>
     auto I = call_args_end() + 1;<br>
-    assert((StatepointCS.arg_end() - I) >= 0);<br>
+    assert((getCallSite().arg_end() - I) >= 0);<br>
     return I;<br>
   }<br>
   typename CallSiteTy::arg_iterator gc_transition_args_end() {<br>
     auto I = gc_transition_args_begin() + getNumTotalGCTransitionArgs();<br>
-    assert((StatepointCS.arg_end() - I) >= 0);<br>
+    assert((getCallSite().arg_end() - I) >= 0);<br>
     return I;<br>
   }<br>
<br>
@@ -170,12 +180,12 @@ public:<br>
<br>
   typename CallSiteTy::arg_iterator vm_state_begin() {<br>
     auto I = gc_transition_args_end() + 1;<br>
-    assert((StatepointCS.arg_end() - I) >= 0);<br>
+    assert((getCallSite().arg_end() - I) >= 0);<br>
     return I;<br>
   }<br>
   typename CallSiteTy::arg_iterator vm_state_end() {<br>
     auto I = vm_state_begin() + getNumTotalVMSArgs();<br>
-    assert((StatepointCS.arg_end() - I) >= 0);<br>
+    assert((getCallSite().arg_end() - I) >= 0);<br>
     return I;<br>
   }<br>
<br>
@@ -186,7 +196,7 @@ public:<br>
<br>
   typename CallSiteTy::arg_iterator gc_args_begin() { return vm_state_end(); }<br>
   typename CallSiteTy::arg_iterator gc_args_end() {<br>
-    return StatepointCS.arg_end();<br>
+    return getCallSite().arg_end();<br>
   }<br>
<br>
   /// range adapter for gc arguments<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>