@@ -2620,7 +2620,8 @@ static bool is_vector_bitwise_not_pattern(Node* n, Node* m) {
26202620bool Matcher::pd_clone_node(Node* n, Node* m, Matcher::MStack& mstack) {
26212621 if (is_vshift_con_pattern(n, m) ||
26222622 is_vector_bitwise_not_pattern(n, m) ||
2623- is_valid_sve_arith_imm_pattern(n, m)) {
2623+ is_valid_sve_arith_imm_pattern(n, m) ||
2624+ is_encode_and_store_pattern(n, m)) {
26242625 mstack.push(m, Visit);
26252626 return true;
26262627 }
@@ -6410,7 +6411,7 @@ instruct loadP(iRegPNoSp dst, memory mem)
64106411instruct loadN(iRegNNoSp dst, memory mem)
64116412%{
64126413 match(Set dst (LoadN mem));
6413- predicate(!needs_acquiring_load(n));
6414+ predicate(!needs_acquiring_load(n) && n->as_Load()->barrier_data() == 0 );
64146415
64156416 ins_cost(4 * INSN_COST);
64166417 format %{ "ldrw $dst, $mem\t# compressed ptr" %}
@@ -6839,7 +6840,7 @@ instruct storeimmP0(immP0 zero, memory mem)
68396840instruct storeN(iRegN src, memory mem)
68406841%{
68416842 match(Set mem (StoreN mem src));
6842- predicate(!needs_releasing_store(n));
6843+ predicate(!needs_releasing_store(n) && n->as_Store()->barrier_data() == 0 );
68436844
68446845 ins_cost(INSN_COST);
68456846 format %{ "strw $src, $mem\t# compressed ptr" %}
@@ -6852,7 +6853,7 @@ instruct storeN(iRegN src, memory mem)
68526853instruct storeImmN0(immN0 zero, memory mem)
68536854%{
68546855 match(Set mem (StoreN mem zero));
6855- predicate(!needs_releasing_store(n));
6856+ predicate(!needs_releasing_store(n) && n->as_Store()->barrier_data() == 0 );
68566857
68576858 ins_cost(INSN_COST);
68586859 format %{ "strw zr, $mem\t# compressed ptr" %}
@@ -7086,6 +7087,7 @@ instruct loadP_volatile(iRegPNoSp dst, /* sync_memory*/indirect mem)
70867087instruct loadN_volatile(iRegNNoSp dst, /* sync_memory*/indirect mem)
70877088%{
70887089 match(Set dst (LoadN mem));
7090+ predicate(n->as_Load()->barrier_data() == 0);
70897091
70907092 ins_cost(VOLATILE_REF_COST);
70917093 format %{ "ldarw $dst, $mem\t# compressed ptr" %}
@@ -7253,6 +7255,7 @@ instruct storeimmP0_volatile(immP0 zero, /* sync_memory*/indirect mem)
72537255instruct storeN_volatile(iRegN src, /* sync_memory*/indirect mem)
72547256%{
72557257 match(Set mem (StoreN mem src));
7258+ predicate(n->as_Store()->barrier_data() == 0);
72567259
72577260 ins_cost(VOLATILE_REF_COST);
72587261 format %{ "stlrw $src, $mem\t# compressed ptr" %}
@@ -7265,6 +7268,7 @@ instruct storeN_volatile(iRegN src, /* sync_memory*/indirect mem)
72657268instruct storeimmN0_volatile(immN0 zero, /* sync_memory*/indirect mem)
72667269%{
72677270 match(Set mem (StoreN mem zero));
7271+ predicate(n->as_Store()->barrier_data() == 0);
72687272
72697273 ins_cost(VOLATILE_REF_COST);
72707274 format %{ "stlrw zr, $mem\t# compressed ptr" %}
@@ -8061,6 +8065,7 @@ instruct compareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval
80618065instruct compareAndSwapN(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegNNoSp newval, rFlagsReg cr) %{
80628066
80638067 match(Set res (CompareAndSwapN mem (Binary oldval newval)));
8068+ predicate(n->as_LoadStore()->barrier_data() == 0);
80648069 ins_cost(2 * VOLATILE_REF_COST);
80658070
80668071 effect(KILL cr);
@@ -8175,7 +8180,7 @@ instruct compareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP new
81758180
81768181instruct compareAndSwapNAcq(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegNNoSp newval, rFlagsReg cr) %{
81778182
8178- predicate(needs_acquiring_load_exclusive(n));
8183+ predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0 );
81798184 match(Set res (CompareAndSwapN mem (Binary oldval newval)));
81808185 ins_cost(VOLATILE_REF_COST);
81818186
@@ -8280,6 +8285,7 @@ instruct compareAndExchangeL(iRegLNoSp res, indirect mem, iRegL oldval, iRegL ne
82808285// This pattern is generated automatically from cas.m4.
82818286// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
82828287instruct compareAndExchangeN(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
8288+ predicate(n->as_LoadStore()->barrier_data() == 0);
82838289 match(Set res (CompareAndExchangeN mem (Binary oldval newval)));
82848290 ins_cost(2 * VOLATILE_REF_COST);
82858291 effect(TEMP_DEF res, KILL cr);
@@ -8389,7 +8395,7 @@ instruct compareAndExchangeLAcq(iRegLNoSp res, indirect mem, iRegL oldval, iRegL
83898395// This pattern is generated automatically from cas.m4.
83908396// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
83918397instruct compareAndExchangeNAcq(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
8392- predicate(needs_acquiring_load_exclusive(n));
8398+ predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0 );
83938399 match(Set res (CompareAndExchangeN mem (Binary oldval newval)));
83948400 ins_cost(VOLATILE_REF_COST);
83958401 effect(TEMP_DEF res, KILL cr);
@@ -8501,6 +8507,7 @@ instruct weakCompareAndSwapL(iRegINoSp res, indirect mem, iRegL oldval, iRegL ne
85018507// This pattern is generated automatically from cas.m4.
85028508// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
85038509instruct weakCompareAndSwapN(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
8510+ predicate(n->as_LoadStore()->barrier_data() == 0);
85048511 match(Set res (WeakCompareAndSwapN mem (Binary oldval newval)));
85058512 ins_cost(2 * VOLATILE_REF_COST);
85068513 effect(KILL cr);
@@ -8620,7 +8627,7 @@ instruct weakCompareAndSwapLAcq(iRegINoSp res, indirect mem, iRegL oldval, iRegL
86208627// This pattern is generated automatically from cas.m4.
86218628// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
86228629instruct weakCompareAndSwapNAcq(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
8623- predicate(needs_acquiring_load_exclusive(n));
8630+ predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0 );
86248631 match(Set res (WeakCompareAndSwapN mem (Binary oldval newval)));
86258632 ins_cost(VOLATILE_REF_COST);
86268633 effect(KILL cr);
@@ -8681,6 +8688,7 @@ instruct get_and_setL(indirect mem, iRegL newv, iRegLNoSp prev) %{
86818688%}
86828689
86838690instruct get_and_setN(indirect mem, iRegN newv, iRegINoSp prev) %{
8691+ predicate(n->as_LoadStore()->barrier_data() == 0);
86848692 match(Set prev (GetAndSetN mem newv));
86858693 ins_cost(2 * VOLATILE_REF_COST);
86868694 format %{ "atomic_xchgw $prev, $newv, [$mem]" %}
@@ -8724,7 +8732,7 @@ instruct get_and_setLAcq(indirect mem, iRegL newv, iRegLNoSp prev) %{
87248732%}
87258733
87268734instruct get_and_setNAcq(indirect mem, iRegN newv, iRegINoSp prev) %{
8727- predicate(needs_acquiring_load_exclusive(n));
8735+ predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0 );
87288736 match(Set prev (GetAndSetN mem newv));
87298737 ins_cost(VOLATILE_REF_COST);
87308738 format %{ "atomic_xchgw_acq $prev, $newv, [$mem]" %}
0 commit comments