[14] RFR (S): 8234394: C2: Dynamic register class support in ADLC
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Tue Nov 19 13:40:47 UTC 2019
http://cr.openjdk.java.net/~vlivanov/jbhateja/8234394/webrev.00/
https://bugs.openjdk.java.net/browse/JDK-8234394
Introduce new "placeholder" register class which denotes that
instructions which use operands of such class should dynamically query
register masks from the operand instance and not hard-code them in the code.
It is required for generic vectors in order to support generic vector
operand (vec/legVec) replacement with fixed-sized vector operands
(vec[SDXYZ]/legVec[SDXYZ]) after matching is over.
As an example of usage, generic vector operand is declared as:
operand vec() %{
constraint(ALLOC_IN_RC(dynamic));
match(VecX);
match(VecY);
match(VecZ);
match(VecS);
match(VecD);
...
Then for an instruction which uses vec as DEF
x86.ad:
instruct loadV4(vec dst, memory mem) %{
=ADLC=>
ad_x86_misc.cpp:
const RegMask &loadV4Node::out_RegMask() const {
return (*_opnds[0]->in_RegMask(0));
}
vs
x86.ad:
instruct loadV4(vecS dst, memory mem) %{
=ADLC=>
ad_x86_misc.cpp:
const RegMask &loadV4Node::out_RegMask() const {
return (VECTORS_REG_VLBWDQ_mask());
}
An operand with dynamic register class can't be used during code
emission and should be replaced with something different before register
allocation:
const RegMask *vecOper::in_RegMask(int index) const {
return &RegMask::Empty;
}
Contributed-by: Jatin Bhateja <jatin.bhateja at intel.com>
Reviewed-by: vlivanov, sviswanathan, ?
Testing: tier1-4 (both with and without generic vector operands)
Best regards,
Vladimir Ivanov
More information about the hotspot-compiler-dev
mailing list