Skip to content

Commit 9cf02de

Browse files
[NVPTX] Stop using 16-bit CAS instructions from PTX
1 parent 30ad53b commit 9cf02de

File tree

5 files changed

+156
-87
lines changed

5 files changed

+156
-87
lines changed

llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -912,7 +912,8 @@ NVPTXTargetLowering::NVPTXTargetLowering(const NVPTXTargetMachine &TM,
912912
// actions
913913
computeRegisterProperties(STI.getRegisterInfo());
914914

915-
setMinCmpXchgSizeInBits(STI.hasAtomCas16() ? 16 : 32);
915+
// PTX support for 16-bit CAS is emulated. Only use 32+
916+
setMinCmpXchgSizeInBits(STI.getMinCmpXchgSizeInBits());
916917
setMaxAtomicSizeInBitsSupported(64);
917918
setMaxDivRemBitWidthSupported(64);
918919
}

llvm/lib/Target/NVPTX/NVPTXSubtarget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ class NVPTXSubtarget : public NVPTXGenSubtargetInfo {
123123
// set of equivalent memory operations with a scalar data-type, executed in
124124
// an unspecified order on the elements in the vector.
125125
unsigned getMaxRequiredAlignment() const { return 8; }
126+
// Get the smallest cmpxchg word size that the hardware supports.
127+
unsigned getMinCmpXchgSizeInBits() const { return 32; }
126128

127129
unsigned getPTXVersion() const { return PTXVersion; }
128130

llvm/test/CodeGen/NVPTX/atomics-sm70.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,10 @@ define void @test(ptr %dp0, ptr addrspace(1) %dp1, ptr addrspace(3) %dp3, half %
132132
; CHECKPTX62-NEXT: @%p4 bra $L__BB0_7;
133133
; CHECKPTX62-NEXT: // %bb.8: // %atomicrmw.end
134134
; CHECKPTX62-NEXT: ret;
135-
%r1 = atomicrmw fadd ptr %dp0, half %val seq_cst
136-
%r2 = atomicrmw fadd ptr %dp0, half 1.0 seq_cst
137-
%r3 = atomicrmw fadd ptr addrspace(1) %dp1, half %val seq_cst
138-
%r4 = atomicrmw fadd ptr addrspace(3) %dp3, half %val seq_cst
135+
%r1 = atomicrmw fadd ptr %dp0, half %val monotonic
136+
%r2 = atomicrmw fadd ptr %dp0, half 1.0 monotonic
137+
%r3 = atomicrmw fadd ptr addrspace(1) %dp1, half %val monotonic
138+
%r4 = atomicrmw fadd ptr addrspace(3) %dp3, half %val monotonic
139139
ret void
140140
}
141141

llvm/test/CodeGen/NVPTX/atomics-sm90.ll

Lines changed: 84 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -46,65 +46,105 @@ define void @test(ptr %dp0, ptr addrspace(1) %dp1, ptr addrspace(3) %dp3, bfloat
4646
; CHECKPTX71-LABEL: test(
4747
; CHECKPTX71: {
4848
; CHECKPTX71-NEXT: .reg .pred %p<5>;
49-
; CHECKPTX71-NEXT: .reg .b16 %rs<34>;
50-
; CHECKPTX71-NEXT: .reg .b32 %r<4>;
49+
; CHECKPTX71-NEXT: .reg .b16 %rs<18>;
50+
; CHECKPTX71-NEXT: .reg .b32 %r<58>;
5151
; CHECKPTX71-NEXT: .reg .f32 %f<12>;
5252
; CHECKPTX71-EMPTY:
5353
; CHECKPTX71-NEXT: // %bb.0:
54-
; CHECKPTX71-NEXT: ld.param.b16 %rs13, [test_param_3];
55-
; CHECKPTX71-NEXT: ld.param.u32 %r3, [test_param_2];
56-
; CHECKPTX71-NEXT: ld.param.u32 %r2, [test_param_1];
57-
; CHECKPTX71-NEXT: ld.param.u32 %r1, [test_param_0];
58-
; CHECKPTX71-NEXT: ld.b16 %rs30, [%r1];
59-
; CHECKPTX71-NEXT: cvt.f32.bf16 %f1, %rs13;
60-
; CHECKPTX71-NEXT: $L__BB0_1: // %atomicrmw.start14
54+
; CHECKPTX71-NEXT: ld.param.b16 %rs1, [test_param_3];
55+
; CHECKPTX71-NEXT: ld.param.u32 %r23, [test_param_2];
56+
; CHECKPTX71-NEXT: ld.param.u32 %r22, [test_param_1];
57+
; CHECKPTX71-NEXT: ld.param.u32 %r24, [test_param_0];
58+
; CHECKPTX71-NEXT: and.b32 %r1, %r24, -4;
59+
; CHECKPTX71-NEXT: and.b32 %r25, %r24, 3;
60+
; CHECKPTX71-NEXT: shl.b32 %r2, %r25, 3;
61+
; CHECKPTX71-NEXT: mov.b32 %r26, 65535;
62+
; CHECKPTX71-NEXT: shl.b32 %r27, %r26, %r2;
63+
; CHECKPTX71-NEXT: not.b32 %r3, %r27;
64+
; CHECKPTX71-NEXT: ld.u32 %r54, [%r1];
65+
; CHECKPTX71-NEXT: cvt.f32.bf16 %f2, %rs1;
66+
; CHECKPTX71-NEXT: $L__BB0_1: // %atomicrmw.start45
6167
; CHECKPTX71-NEXT: // =>This Inner Loop Header: Depth=1
62-
; CHECKPTX71-NEXT: cvt.f32.bf16 %f2, %rs30;
63-
; CHECKPTX71-NEXT: add.rn.f32 %f3, %f2, %f1;
64-
; CHECKPTX71-NEXT: cvt.rn.bf16.f32 %rs14, %f3;
65-
; CHECKPTX71-NEXT: atom.cas.b16 %rs17, [%r1], %rs30, %rs14;
66-
; CHECKPTX71-NEXT: setp.ne.s16 %p1, %rs17, %rs30;
67-
; CHECKPTX71-NEXT: mov.u16 %rs30, %rs17;
68+
; CHECKPTX71-NEXT: shr.u32 %r28, %r54, %r2;
69+
; CHECKPTX71-NEXT: cvt.u16.u32 %rs2, %r28;
70+
; CHECKPTX71-NEXT: cvt.f32.bf16 %f1, %rs2;
71+
; CHECKPTX71-NEXT: add.rn.f32 %f3, %f1, %f2;
72+
; CHECKPTX71-NEXT: cvt.rn.bf16.f32 %rs4, %f3;
73+
; CHECKPTX71-NEXT: cvt.u32.u16 %r29, %rs4;
74+
; CHECKPTX71-NEXT: shl.b32 %r30, %r29, %r2;
75+
; CHECKPTX71-NEXT: and.b32 %r31, %r54, %r3;
76+
; CHECKPTX71-NEXT: or.b32 %r32, %r31, %r30;
77+
; CHECKPTX71-NEXT: atom.cas.b32 %r6, [%r1], %r54, %r32;
78+
; CHECKPTX71-NEXT: setp.ne.s32 %p1, %r6, %r54;
79+
; CHECKPTX71-NEXT: mov.u32 %r54, %r6;
6880
; CHECKPTX71-NEXT: @%p1 bra $L__BB0_1;
69-
; CHECKPTX71-NEXT: // %bb.2: // %atomicrmw.end13
70-
; CHECKPTX71-NEXT: ld.b16 %rs31, [%r1];
71-
; CHECKPTX71-NEXT: $L__BB0_3: // %atomicrmw.start8
81+
; CHECKPTX71-NEXT: // %bb.2: // %atomicrmw.end44
82+
; CHECKPTX71-NEXT: ld.u32 %r55, [%r1];
83+
; CHECKPTX71-NEXT: $L__BB0_3: // %atomicrmw.start27
7284
; CHECKPTX71-NEXT: // =>This Inner Loop Header: Depth=1
73-
; CHECKPTX71-NEXT: cvt.f32.bf16 %f4, %rs31;
85+
; CHECKPTX71-NEXT: shr.u32 %r33, %r55, %r2;
86+
; CHECKPTX71-NEXT: cvt.u16.u32 %rs6, %r33;
87+
; CHECKPTX71-NEXT: cvt.f32.bf16 %f4, %rs6;
7488
; CHECKPTX71-NEXT: add.rn.f32 %f5, %f4, 0f3F800000;
75-
; CHECKPTX71-NEXT: cvt.rn.bf16.f32 %rs18, %f5;
76-
; CHECKPTX71-NEXT: atom.cas.b16 %rs21, [%r1], %rs31, %rs18;
77-
; CHECKPTX71-NEXT: setp.ne.s16 %p2, %rs21, %rs31;
78-
; CHECKPTX71-NEXT: mov.u16 %rs31, %rs21;
89+
; CHECKPTX71-NEXT: cvt.rn.bf16.f32 %rs8, %f5;
90+
; CHECKPTX71-NEXT: cvt.u32.u16 %r34, %rs8;
91+
; CHECKPTX71-NEXT: shl.b32 %r35, %r34, %r2;
92+
; CHECKPTX71-NEXT: and.b32 %r36, %r55, %r3;
93+
; CHECKPTX71-NEXT: or.b32 %r37, %r36, %r35;
94+
; CHECKPTX71-NEXT: atom.cas.b32 %r9, [%r1], %r55, %r37;
95+
; CHECKPTX71-NEXT: setp.ne.s32 %p2, %r9, %r55;
96+
; CHECKPTX71-NEXT: mov.u32 %r55, %r9;
7997
; CHECKPTX71-NEXT: @%p2 bra $L__BB0_3;
80-
; CHECKPTX71-NEXT: // %bb.4: // %atomicrmw.end7
81-
; CHECKPTX71-NEXT: ld.global.b16 %rs32, [%r2];
82-
; CHECKPTX71-NEXT: $L__BB0_5: // %atomicrmw.start2
98+
; CHECKPTX71-NEXT: // %bb.4: // %atomicrmw.end26
99+
; CHECKPTX71-NEXT: and.b32 %r10, %r22, -4;
100+
; CHECKPTX71-NEXT: shl.b32 %r38, %r22, 3;
101+
; CHECKPTX71-NEXT: and.b32 %r11, %r38, 24;
102+
; CHECKPTX71-NEXT: shl.b32 %r40, %r26, %r11;
103+
; CHECKPTX71-NEXT: not.b32 %r12, %r40;
104+
; CHECKPTX71-NEXT: ld.global.u32 %r56, [%r10];
105+
; CHECKPTX71-NEXT: $L__BB0_5: // %atomicrmw.start9
83106
; CHECKPTX71-NEXT: // =>This Inner Loop Header: Depth=1
84-
; CHECKPTX71-NEXT: cvt.f32.bf16 %f7, %rs32;
85-
; CHECKPTX71-NEXT: add.rn.f32 %f8, %f7, %f1;
86-
; CHECKPTX71-NEXT: cvt.rn.bf16.f32 %rs22, %f8;
87-
; CHECKPTX71-NEXT: atom.global.cas.b16 %rs25, [%r2], %rs32, %rs22;
88-
; CHECKPTX71-NEXT: setp.ne.s16 %p3, %rs25, %rs32;
89-
; CHECKPTX71-NEXT: mov.u16 %rs32, %rs25;
107+
; CHECKPTX71-NEXT: shr.u32 %r41, %r56, %r11;
108+
; CHECKPTX71-NEXT: cvt.u16.u32 %rs10, %r41;
109+
; CHECKPTX71-NEXT: cvt.f32.bf16 %f6, %rs10;
110+
; CHECKPTX71-NEXT: add.rn.f32 %f8, %f6, %f2;
111+
; CHECKPTX71-NEXT: cvt.rn.bf16.f32 %rs12, %f8;
112+
; CHECKPTX71-NEXT: cvt.u32.u16 %r42, %rs12;
113+
; CHECKPTX71-NEXT: shl.b32 %r43, %r42, %r11;
114+
; CHECKPTX71-NEXT: and.b32 %r44, %r56, %r12;
115+
; CHECKPTX71-NEXT: or.b32 %r45, %r44, %r43;
116+
; CHECKPTX71-NEXT: atom.global.cas.b32 %r15, [%r10], %r56, %r45;
117+
; CHECKPTX71-NEXT: setp.ne.s32 %p3, %r15, %r56;
118+
; CHECKPTX71-NEXT: mov.u32 %r56, %r15;
90119
; CHECKPTX71-NEXT: @%p3 bra $L__BB0_5;
91-
; CHECKPTX71-NEXT: // %bb.6: // %atomicrmw.end1
92-
; CHECKPTX71-NEXT: ld.shared.b16 %rs33, [%r3];
120+
; CHECKPTX71-NEXT: // %bb.6: // %atomicrmw.end8
121+
; CHECKPTX71-NEXT: and.b32 %r16, %r23, -4;
122+
; CHECKPTX71-NEXT: shl.b32 %r46, %r23, 3;
123+
; CHECKPTX71-NEXT: and.b32 %r17, %r46, 24;
124+
; CHECKPTX71-NEXT: shl.b32 %r48, %r26, %r17;
125+
; CHECKPTX71-NEXT: not.b32 %r18, %r48;
126+
; CHECKPTX71-NEXT: ld.shared.u32 %r57, [%r16];
93127
; CHECKPTX71-NEXT: $L__BB0_7: // %atomicrmw.start
94128
; CHECKPTX71-NEXT: // =>This Inner Loop Header: Depth=1
95-
; CHECKPTX71-NEXT: cvt.f32.bf16 %f10, %rs33;
96-
; CHECKPTX71-NEXT: add.rn.f32 %f11, %f10, %f1;
97-
; CHECKPTX71-NEXT: cvt.rn.bf16.f32 %rs26, %f11;
98-
; CHECKPTX71-NEXT: atom.shared.cas.b16 %rs29, [%r3], %rs33, %rs26;
99-
; CHECKPTX71-NEXT: setp.ne.s16 %p4, %rs29, %rs33;
100-
; CHECKPTX71-NEXT: mov.u16 %rs33, %rs29;
129+
; CHECKPTX71-NEXT: shr.u32 %r49, %r57, %r17;
130+
; CHECKPTX71-NEXT: cvt.u16.u32 %rs14, %r49;
131+
; CHECKPTX71-NEXT: cvt.f32.bf16 %f9, %rs14;
132+
; CHECKPTX71-NEXT: add.rn.f32 %f11, %f9, %f2;
133+
; CHECKPTX71-NEXT: cvt.rn.bf16.f32 %rs16, %f11;
134+
; CHECKPTX71-NEXT: cvt.u32.u16 %r50, %rs16;
135+
; CHECKPTX71-NEXT: shl.b32 %r51, %r50, %r17;
136+
; CHECKPTX71-NEXT: and.b32 %r52, %r57, %r18;
137+
; CHECKPTX71-NEXT: or.b32 %r53, %r52, %r51;
138+
; CHECKPTX71-NEXT: atom.shared.cas.b32 %r21, [%r16], %r57, %r53;
139+
; CHECKPTX71-NEXT: setp.ne.s32 %p4, %r21, %r57;
140+
; CHECKPTX71-NEXT: mov.u32 %r57, %r21;
101141
; CHECKPTX71-NEXT: @%p4 bra $L__BB0_7;
102142
; CHECKPTX71-NEXT: // %bb.8: // %atomicrmw.end
103143
; CHECKPTX71-NEXT: ret;
104-
%r1 = atomicrmw fadd ptr %dp0, bfloat %val seq_cst
105-
%r2 = atomicrmw fadd ptr %dp0, bfloat 1.0 seq_cst
106-
%r3 = atomicrmw fadd ptr addrspace(1) %dp1, bfloat %val seq_cst
107-
%r4 = atomicrmw fadd ptr addrspace(3) %dp3, bfloat %val seq_cst
144+
%r1 = atomicrmw fadd ptr %dp0, bfloat %val monotonic
145+
%r2 = atomicrmw fadd ptr %dp0, bfloat 1.0 monotonic
146+
%r3 = atomicrmw fadd ptr addrspace(1) %dp1, bfloat %val monotonic
147+
%r4 = atomicrmw fadd ptr addrspace(3) %dp3, bfloat %val monotonic
108148
ret void
109149
}
110150

llvm/test/CodeGen/NVPTX/cmpxchg.ll

Lines changed: 64 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -53,43 +53,44 @@ define i8 @relaxed_sys_i8(ptr %addr, i8 %cmp, i8 %new) {
5353
; SM70-LABEL: relaxed_sys_i8(
5454
; SM70: {
5555
; SM70-NEXT: .reg .pred %p<3>;
56-
; SM70-NEXT: .reg .b16 %rs<17>;
57-
; SM70-NEXT: .reg .b32 %r<3>;
58-
; SM70-NEXT: .reg .b64 %rd<5>;
56+
; SM70-NEXT: .reg .b16 %rs<2>;
57+
; SM70-NEXT: .reg .b32 %r<21>;
58+
; SM70-NEXT: .reg .b64 %rd<3>;
5959
; SM70-EMPTY:
6060
; SM70-NEXT: // %bb.0:
61-
; SM70-NEXT: ld.param.u8 %rs9, [relaxed_sys_i8_param_2];
61+
; SM70-NEXT: ld.param.u8 %rs1, [relaxed_sys_i8_param_2];
6262
; SM70-NEXT: ld.param.u64 %rd2, [relaxed_sys_i8_param_0];
63-
; SM70-NEXT: and.b64 %rd1, %rd2, -2;
64-
; SM70-NEXT: ld.param.u8 %rs10, [relaxed_sys_i8_param_1];
65-
; SM70-NEXT: and.b64 %rd3, %rd2, 1;
66-
; SM70-NEXT: shl.b64 %rd4, %rd3, 3;
67-
; SM70-NEXT: cvt.u32.u64 %r1, %rd4;
68-
; SM70-NEXT: mov.u16 %rs11, 255;
69-
; SM70-NEXT: shl.b16 %rs12, %rs11, %r1;
70-
; SM70-NEXT: not.b16 %rs2, %rs12;
71-
; SM70-NEXT: shl.b16 %rs3, %rs9, %r1;
72-
; SM70-NEXT: shl.b16 %rs4, %rs10, %r1;
73-
; SM70-NEXT: ld.u16 %rs13, [%rd1];
74-
; SM70-NEXT: and.b16 %rs16, %rs13, %rs2;
63+
; SM70-NEXT: and.b64 %rd1, %rd2, -4;
64+
; SM70-NEXT: cvt.u32.u64 %r9, %rd2;
65+
; SM70-NEXT: and.b32 %r10, %r9, 3;
66+
; SM70-NEXT: shl.b32 %r1, %r10, 3;
67+
; SM70-NEXT: mov.b32 %r11, 255;
68+
; SM70-NEXT: shl.b32 %r12, %r11, %r1;
69+
; SM70-NEXT: not.b32 %r2, %r12;
70+
; SM70-NEXT: cvt.u32.u16 %r13, %rs1;
71+
; SM70-NEXT: and.b32 %r14, %r13, 255;
72+
; SM70-NEXT: shl.b32 %r3, %r14, %r1;
73+
; SM70-NEXT: ld.param.u8 %r15, [relaxed_sys_i8_param_1];
74+
; SM70-NEXT: shl.b32 %r4, %r15, %r1;
75+
; SM70-NEXT: ld.u32 %r16, [%rd1];
76+
; SM70-NEXT: and.b32 %r20, %r16, %r2;
7577
; SM70-NEXT: $L__BB0_1: // %partword.cmpxchg.loop
7678
; SM70-NEXT: // =>This Inner Loop Header: Depth=1
77-
; SM70-NEXT: or.b16 %rs14, %rs16, %rs3;
78-
; SM70-NEXT: or.b16 %rs15, %rs16, %rs4;
79-
; SM70-NEXT: atom.cas.b16 %rs7, [%rd1], %rs15, %rs14;
80-
; SM70-NEXT: setp.eq.s16 %p1, %rs7, %rs15;
79+
; SM70-NEXT: or.b32 %r17, %r20, %r3;
80+
; SM70-NEXT: or.b32 %r18, %r20, %r4;
81+
; SM70-NEXT: atom.cas.b32 %r7, [%rd1], %r18, %r17;
82+
; SM70-NEXT: setp.eq.s32 %p1, %r7, %r18;
8183
; SM70-NEXT: @%p1 bra $L__BB0_3;
8284
; SM70-NEXT: // %bb.2: // %partword.cmpxchg.failure
8385
; SM70-NEXT: // in Loop: Header=BB0_1 Depth=1
84-
; SM70-NEXT: and.b16 %rs8, %rs7, %rs2;
85-
; SM70-NEXT: setp.ne.s16 %p2, %rs16, %rs8;
86-
; SM70-NEXT: mov.u16 %rs16, %rs8;
86+
; SM70-NEXT: and.b32 %r8, %r7, %r2;
87+
; SM70-NEXT: setp.ne.s32 %p2, %r20, %r8;
88+
; SM70-NEXT: mov.u32 %r20, %r8;
8789
; SM70-NEXT: @%p2 bra $L__BB0_1;
8890
; SM70-NEXT: $L__BB0_3: // %partword.cmpxchg.end
89-
; SM70-NEXT: cvt.u32.u16 %r2, %rs9;
90-
; SM70-NEXT: st.param.b32 [func_retval0], %r2;
91+
; SM70-NEXT: st.param.b32 [func_retval0], %r13;
9192
; SM70-NEXT: ret;
92-
%pairold = cmpxchg ptr %addr, i8 %cmp, i8 %new seq_cst seq_cst
93+
%pairold = cmpxchg ptr %addr, i8 %cmp, i8 %new monotonic monotonic
9394
ret i8 %new
9495
}
9596

@@ -137,19 +138,44 @@ define i16 @relaxed_sys_i16(ptr %addr, i16 %cmp, i16 %new) {
137138
;
138139
; SM70-LABEL: relaxed_sys_i16(
139140
; SM70: {
140-
; SM70-NEXT: .reg .b16 %rs<4>;
141-
; SM70-NEXT: .reg .b32 %r<2>;
142-
; SM70-NEXT: .reg .b64 %rd<2>;
141+
; SM70-NEXT: .reg .pred %p<3>;
142+
; SM70-NEXT: .reg .b16 %rs<2>;
143+
; SM70-NEXT: .reg .b32 %r<20>;
144+
; SM70-NEXT: .reg .b64 %rd<3>;
143145
; SM70-EMPTY:
144146
; SM70-NEXT: // %bb.0:
145-
; SM70-NEXT: ld.param.u64 %rd1, [relaxed_sys_i16_param_0];
146-
; SM70-NEXT: ld.param.u16 %rs1, [relaxed_sys_i16_param_1];
147-
; SM70-NEXT: ld.param.u16 %rs2, [relaxed_sys_i16_param_2];
148-
; SM70-NEXT: atom.cas.b16 %rs3, [%rd1], %rs1, %rs2;
149-
; SM70-NEXT: cvt.u32.u16 %r1, %rs2;
150-
; SM70-NEXT: st.param.b32 [func_retval0], %r1;
147+
; SM70-NEXT: ld.param.u16 %rs1, [relaxed_sys_i16_param_2];
148+
; SM70-NEXT: ld.param.u64 %rd2, [relaxed_sys_i16_param_0];
149+
; SM70-NEXT: and.b64 %rd1, %rd2, -4;
150+
; SM70-NEXT: ld.param.u16 %r9, [relaxed_sys_i16_param_1];
151+
; SM70-NEXT: cvt.u32.u64 %r10, %rd2;
152+
; SM70-NEXT: and.b32 %r11, %r10, 3;
153+
; SM70-NEXT: shl.b32 %r1, %r11, 3;
154+
; SM70-NEXT: mov.b32 %r12, 65535;
155+
; SM70-NEXT: shl.b32 %r13, %r12, %r1;
156+
; SM70-NEXT: not.b32 %r2, %r13;
157+
; SM70-NEXT: cvt.u32.u16 %r14, %rs1;
158+
; SM70-NEXT: shl.b32 %r3, %r14, %r1;
159+
; SM70-NEXT: shl.b32 %r4, %r9, %r1;
160+
; SM70-NEXT: ld.u32 %r15, [%rd1];
161+
; SM70-NEXT: and.b32 %r19, %r15, %r2;
162+
; SM70-NEXT: $L__BB1_1: // %partword.cmpxchg.loop
163+
; SM70-NEXT: // =>This Inner Loop Header: Depth=1
164+
; SM70-NEXT: or.b32 %r16, %r19, %r3;
165+
; SM70-NEXT: or.b32 %r17, %r19, %r4;
166+
; SM70-NEXT: atom.cas.b32 %r7, [%rd1], %r17, %r16;
167+
; SM70-NEXT: setp.eq.s32 %p1, %r7, %r17;
168+
; SM70-NEXT: @%p1 bra $L__BB1_3;
169+
; SM70-NEXT: // %bb.2: // %partword.cmpxchg.failure
170+
; SM70-NEXT: // in Loop: Header=BB1_1 Depth=1
171+
; SM70-NEXT: and.b32 %r8, %r7, %r2;
172+
; SM70-NEXT: setp.ne.s32 %p2, %r19, %r8;
173+
; SM70-NEXT: mov.u32 %r19, %r8;
174+
; SM70-NEXT: @%p2 bra $L__BB1_1;
175+
; SM70-NEXT: $L__BB1_3: // %partword.cmpxchg.end
176+
; SM70-NEXT: st.param.b32 [func_retval0], %r14;
151177
; SM70-NEXT: ret;
152-
%pairold = cmpxchg ptr %addr, i16 %cmp, i16 %new seq_cst seq_cst
178+
%pairold = cmpxchg ptr %addr, i16 %cmp, i16 %new monotonic monotonic
153179
ret i16 %new
154180
}
155181

@@ -180,7 +206,7 @@ define i32 @relaxed_sys_i32(ptr %addr, i32 %cmp, i32 %new) {
180206
; SM70-NEXT: atom.cas.b32 %r3, [%rd1], %r1, %r2;
181207
; SM70-NEXT: st.param.b32 [func_retval0], %r2;
182208
; SM70-NEXT: ret;
183-
%pairold = cmpxchg ptr %addr, i32 %cmp, i32 %new seq_cst seq_cst
209+
%pairold = cmpxchg ptr %addr, i32 %cmp, i32 %new monotonic monotonic
184210
ret i32 %new
185211
}
186212

@@ -209,7 +235,7 @@ define i64 @relaxed_sys_i64(ptr %addr, i64 %cmp, i64 %new) {
209235
; SM70-NEXT: atom.cas.b64 %rd4, [%rd1], %rd2, %rd3;
210236
; SM70-NEXT: st.param.b64 [func_retval0], %rd3;
211237
; SM70-NEXT: ret;
212-
%pairold = cmpxchg ptr %addr, i64 %cmp, i64 %new seq_cst seq_cst
238+
%pairold = cmpxchg ptr %addr, i64 %cmp, i64 %new monotonic monotonic
213239
ret i64 %new
214240
}
215241
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:

0 commit comments

Comments
 (0)