<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>