Skip to content

Commit 394f59c

Browse files
[NVPTX] Add Read/Write/SideEffect attributes to atomic instructions (#109665)
Set the mayLoad, mayStore, and hasSideEffects hints for NVPTX atomic instructions. This prevents any optimizations (e.g. rematerialization) from illegally duplicating them and generating broken code.
1 parent b1aea98 commit 394f59c

File tree

1 file changed

+46
-40
lines changed

1 file changed

+46
-40
lines changed

llvm/lib/Target/NVPTX/NVPTXIntrinsics.td

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,14 +1619,16 @@ multiclass F_ATOMIC_2_imp<ValueType ptrT, NVPTXRegClass ptrclass,
16191619
ValueType regT, NVPTXRegClass regclass,
16201620
string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp,
16211621
Operand IMMType, SDNode IMM, list<Predicate> Pred> {
1622-
def reg : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, regclass:$b),
1623-
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b;"),
1624-
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), (regT regclass:$b)))]>,
1625-
Requires<Pred>;
1626-
def imm : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, IMMType:$b),
1627-
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b;", ""),
1628-
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), IMM:$b))]>,
1629-
Requires<!if(!or(!eq(TypeStr, ".f16"), !eq(TypeStr, ".bf16")), [Predicate<"false">], Pred)>;
1622+
let mayLoad = 1, mayStore = 1, hasSideEffects = 1 in {
1623+
def reg : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, regclass:$b),
1624+
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b;"),
1625+
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), (regT regclass:$b)))]>,
1626+
Requires<Pred>;
1627+
def imm : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, IMMType:$b),
1628+
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b;", ""),
1629+
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), IMM:$b))]>,
1630+
Requires<!if(!or(!eq(TypeStr, ".f16"), !eq(TypeStr, ".bf16")), [Predicate<"false">], Pred)>;
1631+
}
16301632
}
16311633
multiclass F_ATOMIC_2<ValueType regT, NVPTXRegClass regclass, string SpaceStr, string TypeStr,
16321634
string OpcStr, PatFrag IntOp, Operand IMMType, SDNode IMM,
@@ -1642,15 +1644,17 @@ multiclass F_ATOMIC_2_NEG_imp<ValueType ptrT, NVPTXRegClass ptrclass,
16421644
ValueType regT, NVPTXRegClass regclass,
16431645
string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp,
16441646
list<Predicate> Pred> {
1645-
def reg : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, regclass:$b),
1646-
!strconcat(
1647-
"{{ \n\t",
1648-
".reg \t.s", TypeStr, " temp; \n\t",
1649-
"neg.s", TypeStr, " \ttemp, $b; \n\t",
1650-
"atom", SpaceStr, OpcStr, ".u", TypeStr, " \t$dst, [$addr], temp; \n\t",
1651-
"}}"),
1652-
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), (regT regclass:$b)))]>,
1653-
Requires<Pred>;
1647+
let mayLoad = 1, mayStore = 1, hasSideEffects = 1 in {
1648+
def reg : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, regclass:$b),
1649+
!strconcat(
1650+
"{{ \n\t",
1651+
".reg \t.s", TypeStr, " temp; \n\t",
1652+
"neg.s", TypeStr, " \ttemp, $b; \n\t",
1653+
"atom", SpaceStr, OpcStr, ".u", TypeStr, " \t$dst, [$addr], temp; \n\t",
1654+
"}}"),
1655+
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), (regT regclass:$b)))]>,
1656+
Requires<Pred>;
1657+
}
16541658
}
16551659
multiclass F_ATOMIC_2_NEG<ValueType regT, NVPTXRegClass regclass, string SpaceStr,
16561660
string TypeStr, string OpcStr, PatFrag IntOp, list<Predicate> Pred = []> {
@@ -1665,29 +1669,31 @@ multiclass F_ATOMIC_3_imp<ValueType ptrT, NVPTXRegClass ptrclass,
16651669
ValueType regT, NVPTXRegClass regclass,
16661670
string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp,
16671671
Operand IMMType, list<Predicate> Pred> {
1668-
def reg : NVPTXInst<(outs regclass:$dst),
1669-
(ins ptrclass:$addr, regclass:$b, regclass:$c),
1670-
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
1671-
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), (regT regclass:$b), (regT regclass:$c)))]>,
1672-
Requires<Pred>;
1673-
1674-
def imm1 : NVPTXInst<(outs regclass:$dst),
1675-
(ins ptrclass:$addr, IMMType:$b, regclass:$c),
1676-
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
1677-
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), imm:$b, (regT regclass:$c)))]>,
1678-
Requires<Pred>;
1679-
1680-
def imm2 : NVPTXInst<(outs regclass:$dst),
1681-
(ins ptrclass:$addr, regclass:$b, IMMType:$c),
1682-
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;", ""),
1683-
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), (regT regclass:$b), imm:$c))]>,
1684-
Requires<Pred>;
1685-
1686-
def imm3 : NVPTXInst<(outs regclass:$dst),
1687-
(ins ptrclass:$addr, IMMType:$b, IMMType:$c),
1688-
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
1689-
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), imm:$b, imm:$c))]>,
1690-
Requires<Pred>;
1672+
let mayLoad = 1, mayStore = 1, hasSideEffects = 1 in {
1673+
def reg : NVPTXInst<(outs regclass:$dst),
1674+
(ins ptrclass:$addr, regclass:$b, regclass:$c),
1675+
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
1676+
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), (regT regclass:$b), (regT regclass:$c)))]>,
1677+
Requires<Pred>;
1678+
1679+
def imm1 : NVPTXInst<(outs regclass:$dst),
1680+
(ins ptrclass:$addr, IMMType:$b, regclass:$c),
1681+
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
1682+
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), imm:$b, (regT regclass:$c)))]>,
1683+
Requires<Pred>;
1684+
1685+
def imm2 : NVPTXInst<(outs regclass:$dst),
1686+
(ins ptrclass:$addr, regclass:$b, IMMType:$c),
1687+
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;", ""),
1688+
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), (regT regclass:$b), imm:$c))]>,
1689+
Requires<Pred>;
1690+
1691+
def imm3 : NVPTXInst<(outs regclass:$dst),
1692+
(ins ptrclass:$addr, IMMType:$b, IMMType:$c),
1693+
!strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
1694+
[(set (regT regclass:$dst), (IntOp (ptrT ptrclass:$addr), imm:$b, imm:$c))]>,
1695+
Requires<Pred>;
1696+
}
16911697
}
16921698
multiclass F_ATOMIC_3<ValueType regT, NVPTXRegClass regclass, string SpaceStr, string TypeStr,
16931699
string OpcStr, PatFrag IntOp, Operand IMMType, list<Predicate> Pred = []> {

0 commit comments

Comments
 (0)