Skip to content

Commit 82676d4

Browse files
authored
[RISCV] Fix bad isel predicate handling for Ztso. (#66739)
The predicates inside the AMOPat class were being overridden by the Predicates = [HasStdExtA] at the instantiation.
1 parent 44e997a commit 82676d4

File tree

3 files changed

+2888
-1355
lines changed

3 files changed

+2888
-1355
lines changed

llvm/lib/Target/RISCV/RISCVFeatures.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ def HasStdExtSvinval : Predicate<"Subtarget->hasStdExtSvinval()">,
549549
def FeatureStdExtZtso
550550
: SubtargetFeature<"experimental-ztso", "HasStdExtZtso", "true",
551551
"'Ztso' (Memory Model - Total Store Order)">;
552-
def HasStdExtZtso : Predicate<"Subtarget->hasStdExtZTso()">,
552+
def HasStdExtZtso : Predicate<"Subtarget->hasStdExtZtso()">,
553553
AssemblerPredicate<(all_of FeatureStdExtZtso),
554554
"'Ztso' (Memory Model - Total Store Order)">;
555555
def NotHasStdExtZtso : Predicate<"!Subtarget->hasStdExtZtso()">;

llvm/lib/Target/RISCV/RISCVInstrInfoA.td

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,9 @@ let Predicates = [HasAtomicLdSt, IsRV64] in {
129129

130130
/// AMOs
131131

132-
multiclass AMOPat<string AtomicOp, string BaseInst, ValueType vt = XLenVT> {
133-
let Predicates = [HasStdExtA, NotHasStdExtZtso] in {
132+
multiclass AMOPat<string AtomicOp, string BaseInst, ValueType vt = XLenVT,
133+
list<Predicate> ExtraPreds = []> {
134+
let Predicates = !listconcat([HasStdExtA, NotHasStdExtZtso], ExtraPreds) in {
134135
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_monotonic"),
135136
!cast<RVInst>(BaseInst), vt>;
136137
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_acquire"),
@@ -142,7 +143,7 @@ let Predicates = [HasStdExtA, NotHasStdExtZtso] in {
142143
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_seq_cst"),
143144
!cast<RVInst>(BaseInst#"_AQ_RL"), vt>;
144145
}
145-
let Predicates = [HasStdExtA, HasStdExtZtso] in {
146+
let Predicates = !listconcat([HasStdExtA, HasStdExtZtso], ExtraPreds) in {
146147
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_monotonic"),
147148
!cast<RVInst>(BaseInst), vt>;
148149
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_acquire"),
@@ -156,8 +157,6 @@ let Predicates = [HasStdExtA, HasStdExtZtso] in {
156157
}
157158
}
158159

159-
let Predicates = [HasStdExtA] in {
160-
161160
defm : AMOPat<"atomic_swap_32", "AMOSWAP_W">;
162161
defm : AMOPat<"atomic_load_add_32", "AMOADD_W">;
163162
defm : AMOPat<"atomic_load_and_32", "AMOAND_W">;
@@ -168,6 +167,8 @@ defm : AMOPat<"atomic_load_min_32", "AMOMIN_W">;
168167
defm : AMOPat<"atomic_load_umax_32", "AMOMAXU_W">;
169168
defm : AMOPat<"atomic_load_umin_32", "AMOMINU_W">;
170169

170+
let Predicates = [HasStdExtA] in {
171+
171172
/// Pseudo AMOs
172173

173174
class PseudoAMO : Pseudo<(outs GPR:$res, GPR:$scratch),
@@ -315,17 +316,17 @@ def : Pat<(int_riscv_masked_cmpxchg_i32
315316

316317
} // Predicates = [HasStdExtA]
317318

318-
let Predicates = [HasStdExtA, IsRV64] in {
319+
defm : AMOPat<"atomic_swap_64", "AMOSWAP_D", i64, [IsRV64]>;
320+
defm : AMOPat<"atomic_load_add_64", "AMOADD_D", i64, [IsRV64]>;
321+
defm : AMOPat<"atomic_load_and_64", "AMOAND_D", i64, [IsRV64]>;
322+
defm : AMOPat<"atomic_load_or_64", "AMOOR_D", i64, [IsRV64]>;
323+
defm : AMOPat<"atomic_load_xor_64", "AMOXOR_D", i64, [IsRV64]>;
324+
defm : AMOPat<"atomic_load_max_64", "AMOMAX_D", i64, [IsRV64]>;
325+
defm : AMOPat<"atomic_load_min_64", "AMOMIN_D", i64, [IsRV64]>;
326+
defm : AMOPat<"atomic_load_umax_64", "AMOMAXU_D", i64, [IsRV64]>;
327+
defm : AMOPat<"atomic_load_umin_64", "AMOMINU_D", i64, [IsRV64]>;
319328

320-
defm : AMOPat<"atomic_swap_64", "AMOSWAP_D", i64>;
321-
defm : AMOPat<"atomic_load_add_64", "AMOADD_D", i64>;
322-
defm : AMOPat<"atomic_load_and_64", "AMOAND_D", i64>;
323-
defm : AMOPat<"atomic_load_or_64", "AMOOR_D", i64>;
324-
defm : AMOPat<"atomic_load_xor_64", "AMOXOR_D", i64>;
325-
defm : AMOPat<"atomic_load_max_64", "AMOMAX_D", i64>;
326-
defm : AMOPat<"atomic_load_min_64", "AMOMIN_D", i64>;
327-
defm : AMOPat<"atomic_load_umax_64", "AMOMAXU_D", i64>;
328-
defm : AMOPat<"atomic_load_umin_64", "AMOMINU_D", i64>;
329+
let Predicates = [HasStdExtA, IsRV64] in {
329330

330331
/// 64-bit pseudo AMOs
331332

0 commit comments

Comments
 (0)