RFR(S): 8077843: adlc: allow nodes that use TEMP inputs in expand rules.
Vladimir Kozlov
vladimir.kozlov at oracle.com
Fri Apr 17 19:13:03 UTC 2015
Okay. I see. Looks good then. I will push it.
Thanks,
Vladimir
On 4/17/15 12:25 AM, Lindenmaier, Goetz wrote:
> HI Vladimir,
>
> the node generated in the Expand has a match rule itself.
> I checked, all the TEMPs we use are in nodes with match rules.
> Anyways, you get a syntax error if not:
> "Syntax Error: <node>: TEMPs without match rule isn't supported"
>
> We use nodes with match rules in expands a lot, as the match rule
> is required for a lot of things. For example to generate the proper
> ideal opcode, get it in the array must_clone etc.
> If we don't want the nodes to be matched, we add predicate(false).
> In our internal VM, we use nodes with TEMPs in expands on ia64 a lot.
>
> For the code generated for the nodes I intend to contribute, see
> below.
>
> Best regards,
> Goetz.
>
>
> // Card-mark for CMS garbage collection.
> // This cardmark does an optimization so that it must not always
> // do a releasing store. For this, it gets the address of
> // CMSCollectorCardTableModRefBSExt::_requires_release as input.
> // (Using releaseFieldAddr in the match rule is a hack.)
> instruct storeCM_CMS(memory mem, iRegLdst releaseFieldAddr, flagsReg crx) %{
> match(Set mem (StoreCM mem releaseFieldAddr));
> effect(TEMP crx);
> predicate(false);
> ins_cost(MEMORY_REF_COST);
>
> // See loadConP.
> ins_cannot_rematerialize(true);
>
> format %{ "STB #0, $mem \t// CMS card-mark byte (must be 0!), checking requires_release in [$releaseFieldAddr]" %}
> ins_encode( enc_cms_card_mark(mem, releaseFieldAddr, crx) );
> ins_pipe(pipe_class_memory);
> %}
>
> // Card-mark for CMS garbage collection.
> // This cardmark does an optimization so that it must not always
> // do a releasing store. For this, it needs the constant address of
> // CMSCollectorCardTableModRefBSExt::_requires_release.
> // This constant address is split off here by expand so we can use
> // adlc / matcher functionality to load it from the constant section.
> instruct storeCM_CMS_ExEx(memory mem, immI_0 zero) %{
> match(Set mem (StoreCM mem zero));
> predicate(UseConcMarkSweepGC);
>
> expand %{
> immL baseImm %{ 0 /* TODO: PPC port (jlong)CMSCollectorCardTableModRefBSExt::requires_release_address() */ %}
> iRegLdst releaseFieldAddress;
> flagsReg crx;
> loadConL_Ex(releaseFieldAddress, baseImm);
> storeCM_CMS(mem, releaseFieldAddress, crx);
> %}
> %}
>
>
> MachNode* storeCM_CMSNode::Expand(State* state, Node_List& proj_list, Node* mem) {
> Compile* C = Compile::current();
> // Add projection edges for additional defs or kills
> // TEMP crx
> MachTempNode *def;
> def = new MachTempNode(state->MachOperGenerator(FLAGSREG));
> add_req(def);
>
> return this;
> }
>
> MachNode* storeCM_CMS_ExExNode::Expand(State* state, Node_List& proj_list, Node* mem) {
> Compile* C = Compile::current();
> MachOper *op0 = new immLOper(
> #line 6571 "/sapmnt/home1/d045726/oJ/8077838-ppc-hs-comp/src/cpu/ppc/vm/ppc.ad"
> 0 /* TODO: PPC port (jlong)CMSCollectorCardTableModRefBSExt::requires_release_address() */
> #line 527 "../generated/adfiles/ad_ppc_64_expand.cpp"
> );
> MachOper *op1 = new iRegLdstOper();
> MachOper *op2 = new flagsRegOper();
> MachNode *tmp0 = this;
> MachNode *tmp1 = this;
> MachNode *tmp2 = this;
> MachNode *tmp3 = NULL;
> MachNode *tmp4 = NULL;
> MachNode *tmp5 = NULL;
> unsigned num0 = 0;
> unsigned num1 = opnd_array(1)->num_edges();
> unsigned num2 = opnd_array(2)->num_edges();
> unsigned idx0 = oper_input_base();
> if (mem == (Node*)1) {
> idx0--; // Adjust base because memory edge hasn't been inserted yet
> }
> unsigned idx1 = idx0 + num0;
> unsigned idx2 = idx1 + num1;
> unsigned idx3 = idx2 + num2;
> MachNode *result = NULL;
>
> loadConL_ExNode *n0 = new loadConL_ExNode();
> n0->add_req(_in[0]);
> ((MachTypeNode*)n0)->_bottom_type = bottom_type();
> n0->set_opnd_array(0, state->MachOperGenerator(IREGLDST));
> tmp4 = n0;
> n0->set_opnd_array(1, op0->clone()); // baseImm
> if(tmp3 != NULL)
> n0->add_req(tmp3);
> result = n0->Expand( state, proj_list, mem );
>
> storeCM_CMSNode *n1 = new storeCM_CMSNode();
> n1->add_req(_in[0]);
> ((MachTypeNode*)n1)->_bottom_type = bottom_type();
> n1->set_opnd_array(0, state->MachOperGenerator(UNIVERSE));
> if (mem != (Node*)1) {
> n1->add_req(_in[1]); // Add memory edge
> }
> n1->set_opnd_array(1, opnd_array(1)->clone()); // mem
> if(tmp1 == this) {
> for(unsigned i = 0; i < num1; i++) {
> n1->add_req(_in[i + idx1]);
> }
> }
> else n1->add_req(tmp1);
> tmp1 = n1;
> n1->set_opnd_array(2, op1->clone()); // releaseFieldAddress
> if(tmp4 != NULL)
> n1->add_req(tmp4);
> n1->set_opnd_array(3, op2->clone()); // crx
> if(tmp5 != NULL)
> n1->add_req(tmp5);
> result = n1->Expand( state, proj_list, mem );
>
>
> return result;
> }
>
>
>
> -----Original Message-----
> From: hotspot-dev [mailto:hotspot-dev-bounces at openjdk.java.net] On Behalf Of Vladimir Kozlov
> Sent: Freitag, 17. April 2015 02:28
> To: hotspot-dev at openjdk.java.net
> Subject: Re: RFR(S): 8077843: adlc: allow nodes that use TEMP inputs in expand rules.
>
> Here is what Tom R said during review of TEMP implementation:
>
> >> 3. In formssel.cpp you restricted TEMP usage only to instruction
> >> with match rule, why? What about effect()?:
> >> + bool InstructForm::has_temps() {
> >> + if (_matrule) {
> >
> >TEMP isn't allowed for instructions which don't have match rules. The
> >reason is that if an instruct doesn't have a match rule the only way
> >it can be constructed is by an expand rule. expand rules look like
> >explicit invocations of encodings but TEMPs are synthetic so you can't
> >properly write an expand rule to work with TEMP. I mean you could
> >make it work but I decided not to support it. I'll make this more
> >explicit.
>
> So I am not sure that just removing the assert will be enough. Please,
> verify.
>
> Regards,
> Vladimir
>
> On 4/15/15 6:08 AM, Lindenmaier, Goetz wrote:
>> Hi,
>>
>> I have a tiny fix that allows nodes that use TEMP inputs / TEMP effect in
>> expand rules.
>>
>> Currently an assertion fires if you do so.
>> This is harmless, though, as the TEMP node is added in the Expand() of the used node,
>> which is called by the Expand() of the node being expanded.
>> Probably the assertion was meant for the node being expanded.
>>
>> The change simply removed the assertion.
>>
>> Please review this change. I please need a sponsor.
>> http://cr.openjdk.java.net/~goetz/webrevs/8077843-adlcTEMP/webrev.01/
>>
>> I need this feature for a change I intend to do in the ppc.ad file.
>>
>> Best regards,
>> Goetz.
>>
More information about the hotspot-dev
mailing list