blob: 0c5abef83c45d323e2110e8a32028621df1e3a37 [file] [log] [blame]
Matthias Braun152e7c82016-07-09 00:19:07 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Craig Topper41d363f2017-10-29 17:15:09 +00002; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=CHECK --check-prefix=FASTINCDEC
3; RUN: llc < %s -mtriple=x86_64-- -mattr=slow-incdec | FileCheck %s --check-prefix=CHECK --check-prefix=SLOWINCDEC
Ahmed Bougachab76e7252016-04-05 20:02:44 +00004
Nikita Popov2f448bf2022-06-22 14:33:12 +02005define i32 @test_add_1_cmov_slt(ptr %p, i32 %a0, i32 %a1) #0 {
Craig Topper41d363f2017-10-29 17:15:09 +00006; FASTINCDEC-LABEL: test_add_1_cmov_slt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +00007; FASTINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +00008; FASTINCDEC-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +00009; FASTINCDEC-NEXT: lock incq (%rdi)
10; FASTINCDEC-NEXT: cmovgl %edx, %eax
Craig Topper41d363f2017-10-29 17:15:09 +000011; FASTINCDEC-NEXT: retq
12;
13; SLOWINCDEC-LABEL: test_add_1_cmov_slt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000014; SLOWINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +000015; SLOWINCDEC-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +000016; SLOWINCDEC-NEXT: lock addq $1, (%rdi)
17; SLOWINCDEC-NEXT: cmovgl %edx, %eax
Craig Topper41d363f2017-10-29 17:15:09 +000018; SLOWINCDEC-NEXT: retq
Ahmed Bougachab76e7252016-04-05 20:02:44 +000019entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +020020 %tmp0 = atomicrmw add ptr %p, i64 1 seq_cst
Ahmed Bougachab76e7252016-04-05 20:02:44 +000021 %tmp1 = icmp slt i64 %tmp0, 0
22 %tmp2 = select i1 %tmp1, i32 %a0, i32 %a1
23 ret i32 %tmp2
24}
25
Nikita Popov2f448bf2022-06-22 14:33:12 +020026define i32 @test_add_1_cmov_sge(ptr %p, i32 %a0, i32 %a1) #0 {
Craig Topper41d363f2017-10-29 17:15:09 +000027; FASTINCDEC-LABEL: test_add_1_cmov_sge:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000028; FASTINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +000029; FASTINCDEC-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +000030; FASTINCDEC-NEXT: lock incq (%rdi)
31; FASTINCDEC-NEXT: cmovlel %edx, %eax
Craig Topper41d363f2017-10-29 17:15:09 +000032; FASTINCDEC-NEXT: retq
33;
34; SLOWINCDEC-LABEL: test_add_1_cmov_sge:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000035; SLOWINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +000036; SLOWINCDEC-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +000037; SLOWINCDEC-NEXT: lock addq $1, (%rdi)
38; SLOWINCDEC-NEXT: cmovlel %edx, %eax
Craig Topper41d363f2017-10-29 17:15:09 +000039; SLOWINCDEC-NEXT: retq
Ahmed Bougacha70bde542016-04-07 02:06:53 +000040entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +020041 %tmp0 = atomicrmw add ptr %p, i64 1 seq_cst
Ahmed Bougacha70bde542016-04-07 02:06:53 +000042 %tmp1 = icmp sge i64 %tmp0, 0
43 %tmp2 = select i1 %tmp1, i32 %a0, i32 %a1
44 ret i32 %tmp2
45}
46
Nikita Popov2f448bf2022-06-22 14:33:12 +020047define i32 @test_sub_1_cmov_sle(ptr %p, i32 %a0, i32 %a1) #0 {
Craig Topper4e13d4d2017-10-30 14:51:37 +000048; FASTINCDEC-LABEL: test_sub_1_cmov_sle:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000049; FASTINCDEC: # %bb.0: # %entry
Craig Topper4e13d4d2017-10-30 14:51:37 +000050; FASTINCDEC-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +000051; FASTINCDEC-NEXT: lock decq (%rdi)
52; FASTINCDEC-NEXT: cmovgel %edx, %eax
Craig Topper4e13d4d2017-10-30 14:51:37 +000053; FASTINCDEC-NEXT: retq
54;
55; SLOWINCDEC-LABEL: test_sub_1_cmov_sle:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000056; SLOWINCDEC: # %bb.0: # %entry
Craig Topper4e13d4d2017-10-30 14:51:37 +000057; SLOWINCDEC-NEXT: movl %esi, %eax
Simon Pilgrim59fa4352021-06-30 16:22:53 +010058; SLOWINCDEC-NEXT: lock subq $1, (%rdi)
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +000059; SLOWINCDEC-NEXT: cmovgel %edx, %eax
Craig Topper4e13d4d2017-10-30 14:51:37 +000060; SLOWINCDEC-NEXT: retq
Ahmed Bougacha70bde542016-04-07 02:06:53 +000061entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +020062 %tmp0 = atomicrmw sub ptr %p, i64 1 seq_cst
Ahmed Bougacha70bde542016-04-07 02:06:53 +000063 %tmp1 = icmp sle i64 %tmp0, 0
64 %tmp2 = select i1 %tmp1, i32 %a0, i32 %a1
65 ret i32 %tmp2
66}
67
Nikita Popov2f448bf2022-06-22 14:33:12 +020068define i32 @test_sub_1_cmov_sgt(ptr %p, i32 %a0, i32 %a1) #0 {
Craig Topper4e13d4d2017-10-30 14:51:37 +000069; FASTINCDEC-LABEL: test_sub_1_cmov_sgt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000070; FASTINCDEC: # %bb.0: # %entry
Craig Topper4e13d4d2017-10-30 14:51:37 +000071; FASTINCDEC-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +000072; FASTINCDEC-NEXT: lock decq (%rdi)
73; FASTINCDEC-NEXT: cmovll %edx, %eax
Craig Topper4e13d4d2017-10-30 14:51:37 +000074; FASTINCDEC-NEXT: retq
75;
76; SLOWINCDEC-LABEL: test_sub_1_cmov_sgt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000077; SLOWINCDEC: # %bb.0: # %entry
Craig Topper4e13d4d2017-10-30 14:51:37 +000078; SLOWINCDEC-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +000079; SLOWINCDEC-NEXT: lock addq $-1, (%rdi)
80; SLOWINCDEC-NEXT: cmovll %edx, %eax
Craig Topper4e13d4d2017-10-30 14:51:37 +000081; SLOWINCDEC-NEXT: retq
Ahmed Bougacha70bde542016-04-07 02:06:53 +000082entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +020083 %tmp0 = atomicrmw sub ptr %p, i64 1 seq_cst
Ahmed Bougacha70bde542016-04-07 02:06:53 +000084 %tmp1 = icmp sgt i64 %tmp0, 0
85 %tmp2 = select i1 %tmp1, i32 %a0, i32 %a1
86 ret i32 %tmp2
87}
88
89; FIXME: (setcc slt x, 0) gets combined into shr early.
Nikita Popov2f448bf2022-06-22 14:33:12 +020090define i8 @test_add_1_setcc_slt(ptr %p) #0 {
Ahmed Bougacha70bde542016-04-07 02:06:53 +000091; CHECK-LABEL: test_add_1_setcc_slt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000092; CHECK: # %bb.0: # %entry
Ahmed Bougacha70bde542016-04-07 02:06:53 +000093; CHECK-NEXT: movl $1, %eax
94; CHECK-NEXT: lock xaddq %rax, (%rdi)
95; CHECK-NEXT: shrq $63, %rax
Puyan Lotfi43e94b12018-01-31 22:04:26 +000096; CHECK-NEXT: # kill: def $al killed $al killed $rax
Ahmed Bougacha70bde542016-04-07 02:06:53 +000097; CHECK-NEXT: retq
98entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +020099 %tmp0 = atomicrmw add ptr %p, i64 1 seq_cst
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000100 %tmp1 = icmp slt i64 %tmp0, 0
101 %tmp2 = zext i1 %tmp1 to i8
102 ret i8 %tmp2
103}
104
Nikita Popov2f448bf2022-06-22 14:33:12 +0200105define i8 @test_sub_1_setcc_sgt(ptr %p) #0 {
Craig Topper4e13d4d2017-10-30 14:51:37 +0000106; FASTINCDEC-LABEL: test_sub_1_setcc_sgt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000107; FASTINCDEC: # %bb.0: # %entry
Craig Topper4e13d4d2017-10-30 14:51:37 +0000108; FASTINCDEC-NEXT: lock decq (%rdi)
109; FASTINCDEC-NEXT: setge %al
110; FASTINCDEC-NEXT: retq
111;
112; SLOWINCDEC-LABEL: test_sub_1_setcc_sgt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000113; SLOWINCDEC: # %bb.0: # %entry
Craig Topper4e13d4d2017-10-30 14:51:37 +0000114; SLOWINCDEC-NEXT: lock addq $-1, (%rdi)
115; SLOWINCDEC-NEXT: setge %al
116; SLOWINCDEC-NEXT: retq
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000117entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200118 %tmp0 = atomicrmw sub ptr %p, i64 1 seq_cst
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000119 %tmp1 = icmp sgt i64 %tmp0, 0
120 %tmp2 = zext i1 %tmp1 to i8
121 ret i8 %tmp2
122}
123
Nikita Popov2f448bf2022-06-22 14:33:12 +0200124define i32 @test_add_1_brcond_sge(ptr %p, i32 %a0, i32 %a1) #0 {
Craig Topper41d363f2017-10-29 17:15:09 +0000125; FASTINCDEC-LABEL: test_add_1_brcond_sge:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000126; FASTINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +0000127; FASTINCDEC-NEXT: lock incq (%rdi)
128; FASTINCDEC-NEXT: jle .LBB6_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000129; FASTINCDEC-NEXT: # %bb.1: # %t
Craig Topper41d363f2017-10-29 17:15:09 +0000130; FASTINCDEC-NEXT: movl %esi, %eax
131; FASTINCDEC-NEXT: retq
132; FASTINCDEC-NEXT: .LBB6_2: # %f
133; FASTINCDEC-NEXT: movl %edx, %eax
134; FASTINCDEC-NEXT: retq
135;
136; SLOWINCDEC-LABEL: test_add_1_brcond_sge:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000137; SLOWINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +0000138; SLOWINCDEC-NEXT: lock addq $1, (%rdi)
139; SLOWINCDEC-NEXT: jle .LBB6_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000140; SLOWINCDEC-NEXT: # %bb.1: # %t
Craig Topper41d363f2017-10-29 17:15:09 +0000141; SLOWINCDEC-NEXT: movl %esi, %eax
142; SLOWINCDEC-NEXT: retq
143; SLOWINCDEC-NEXT: .LBB6_2: # %f
144; SLOWINCDEC-NEXT: movl %edx, %eax
145; SLOWINCDEC-NEXT: retq
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000146entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200147 %tmp0 = atomicrmw add ptr %p, i64 1 seq_cst
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000148 %tmp1 = icmp sge i64 %tmp0, 0
149 br i1 %tmp1, label %t, label %f
150t:
151 ret i32 %a0
152f:
153 ret i32 %a1
154}
155
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000156; Also make sure we don't muck with condition codes that we should ignore.
157; No need to test unsigned comparisons, as they should all be simplified.
158
Nikita Popov2f448bf2022-06-22 14:33:12 +0200159define i32 @test_add_1_cmov_sle(ptr %p, i32 %a0, i32 %a1) #0 {
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000160; CHECK-LABEL: test_add_1_cmov_sle:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000161; CHECK: # %bb.0: # %entry
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000162; CHECK-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +0000163; CHECK-NEXT: movl $1, %ecx
164; CHECK-NEXT: lock xaddq %rcx, (%rdi)
165; CHECK-NEXT: testq %rcx, %rcx
166; CHECK-NEXT: cmovgl %edx, %eax
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000167; CHECK-NEXT: retq
168entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200169 %tmp0 = atomicrmw add ptr %p, i64 1 seq_cst
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000170 %tmp1 = icmp sle i64 %tmp0, 0
171 %tmp2 = select i1 %tmp1, i32 %a0, i32 %a1
172 ret i32 %tmp2
173}
174
Nikita Popov2f448bf2022-06-22 14:33:12 +0200175define i32 @test_add_1_cmov_sgt(ptr %p, i32 %a0, i32 %a1) #0 {
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000176; CHECK-LABEL: test_add_1_cmov_sgt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000177; CHECK: # %bb.0: # %entry
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000178; CHECK-NEXT: movl %esi, %eax
Simon Pilgrim2d0f20c2018-09-19 18:59:08 +0000179; CHECK-NEXT: movl $1, %ecx
180; CHECK-NEXT: lock xaddq %rcx, (%rdi)
181; CHECK-NEXT: testq %rcx, %rcx
182; CHECK-NEXT: cmovlel %edx, %eax
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000183; CHECK-NEXT: retq
184entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200185 %tmp0 = atomicrmw add ptr %p, i64 1 seq_cst
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000186 %tmp1 = icmp sgt i64 %tmp0, 0
187 %tmp2 = select i1 %tmp1, i32 %a0, i32 %a1
188 ret i32 %tmp2
189}
190
191; Test a result being used by more than just the comparison.
192
Nikita Popov2f448bf2022-06-22 14:33:12 +0200193define i8 @test_add_1_setcc_sgt_reuse(ptr %p, ptr %p2) #0 {
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000194; CHECK-LABEL: test_add_1_setcc_sgt_reuse:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000195; CHECK: # %bb.0: # %entry
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000196; CHECK-NEXT: movl $1, %ecx
197; CHECK-NEXT: lock xaddq %rcx, (%rdi)
198; CHECK-NEXT: testq %rcx, %rcx
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000199; CHECK-NEXT: setg %al
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000200; CHECK-NEXT: movq %rcx, (%rsi)
201; CHECK-NEXT: retq
202entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200203 %tmp0 = atomicrmw add ptr %p, i64 1 seq_cst
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000204 %tmp1 = icmp sgt i64 %tmp0, 0
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000205 %tmp2 = zext i1 %tmp1 to i8
Nikita Popov2f448bf2022-06-22 14:33:12 +0200206 store i64 %tmp0, ptr %p2
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000207 ret i8 %tmp2
208}
209
Nikita Popov2f448bf2022-06-22 14:33:12 +0200210define i8 @test_sub_2_setcc_sgt(ptr %p) #0 {
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000211; CHECK-LABEL: test_sub_2_setcc_sgt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000212; CHECK: # %bb.0: # %entry
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000213; CHECK-NEXT: movq $-2, %rax
214; CHECK-NEXT: lock xaddq %rax, (%rdi)
215; CHECK-NEXT: testq %rax, %rax
216; CHECK-NEXT: setg %al
217; CHECK-NEXT: retq
218entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200219 %tmp0 = atomicrmw sub ptr %p, i64 2 seq_cst
Ahmed Bougacha70bde542016-04-07 02:06:53 +0000220 %tmp1 = icmp sgt i64 %tmp0, 0
221 %tmp2 = zext i1 %tmp1 to i8
222 ret i8 %tmp2
223}
224
Hans Wennborg12de6932017-01-11 00:49:54 +0000225; TODO: It's possible to use "lock inc" here, but both cmovs need to be updated.
Nikita Popov2f448bf2022-06-22 14:33:12 +0200226define i8 @test_add_1_cmov_cmov(ptr %p, ptr %q) #0 {
Hans Wennborg12de6932017-01-11 00:49:54 +0000227; CHECK-LABEL: test_add_1_cmov_cmov:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000228; CHECK: # %bb.0: # %entry
Hans Wennborg12de6932017-01-11 00:49:54 +0000229; CHECK-NEXT: movl $1, %eax
230; CHECK-NEXT: lock xaddq %rax, (%rdi)
Simon Pilgrimdecab8e2021-04-27 15:39:06 +0100231; CHECK-NEXT: testq %rax, %rax
Simon Pilgrim05953cf2021-04-22 14:06:57 +0100232; CHECK-NEXT: movl $12, %eax
233; CHECK-NEXT: movl $34, %ecx
234; CHECK-NEXT: cmovsl %eax, %ecx
235; CHECK-NEXT: movb %cl, (%rsi)
236; CHECK-NEXT: movl $56, %ecx
237; CHECK-NEXT: movl $78, %eax
238; CHECK-NEXT: cmovsl %ecx, %eax
239; CHECK-NEXT: # kill: def $al killed $al killed $eax
240; CHECK-NEXT: retq
Hans Wennborg12de6932017-01-11 00:49:54 +0000241entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200242 %add = atomicrmw add ptr %p, i64 1 seq_cst
Hans Wennborg12de6932017-01-11 00:49:54 +0000243 %cmp = icmp slt i64 %add, 0
244 %s1 = select i1 %cmp, i8 12, i8 34
Nikita Popov2f448bf2022-06-22 14:33:12 +0200245 store i8 %s1, ptr %q
Hans Wennborg12de6932017-01-11 00:49:54 +0000246 %s2 = select i1 %cmp, i8 56, i8 78
247 ret i8 %s2
248}
249
Nikita Popov2f448bf2022-06-22 14:33:12 +0200250define i8 @test_sub_1_cmp_1_setcc_eq(ptr %p) #0 {
Craig Topper41d363f2017-10-29 17:15:09 +0000251; FASTINCDEC-LABEL: test_sub_1_cmp_1_setcc_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000252; FASTINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +0000253; FASTINCDEC-NEXT: lock decq (%rdi)
254; FASTINCDEC-NEXT: sete %al
255; FASTINCDEC-NEXT: retq
256;
257; SLOWINCDEC-LABEL: test_sub_1_cmp_1_setcc_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000258; SLOWINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +0000259; SLOWINCDEC-NEXT: lock subq $1, (%rdi)
260; SLOWINCDEC-NEXT: sete %al
261; SLOWINCDEC-NEXT: retq
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000262entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200263 %tmp0 = atomicrmw sub ptr %p, i64 1 seq_cst
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000264 %tmp1 = icmp eq i64 %tmp0, 1
265 %tmp2 = zext i1 %tmp1 to i8
266 ret i8 %tmp2
267}
268
Nikita Popov2f448bf2022-06-22 14:33:12 +0200269define i8 @test_sub_1_cmp_1_setcc_ne(ptr %p) #0 {
Craig Topper41d363f2017-10-29 17:15:09 +0000270; FASTINCDEC-LABEL: test_sub_1_cmp_1_setcc_ne:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000271; FASTINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +0000272; FASTINCDEC-NEXT: lock decq (%rdi)
273; FASTINCDEC-NEXT: setne %al
274; FASTINCDEC-NEXT: retq
275;
276; SLOWINCDEC-LABEL: test_sub_1_cmp_1_setcc_ne:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000277; SLOWINCDEC: # %bb.0: # %entry
Craig Topper41d363f2017-10-29 17:15:09 +0000278; SLOWINCDEC-NEXT: lock subq $1, (%rdi)
279; SLOWINCDEC-NEXT: setne %al
280; SLOWINCDEC-NEXT: retq
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000281entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200282 %tmp0 = atomicrmw sub ptr %p, i64 1 seq_cst
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000283 %tmp1 = icmp ne i64 %tmp0, 1
284 %tmp2 = zext i1 %tmp1 to i8
285 ret i8 %tmp2
286}
287
Nikita Popov2f448bf2022-06-22 14:33:12 +0200288define i8 @test_sub_1_cmp_1_setcc_ugt(ptr %p) #0 {
Craig Topper4e13d4d2017-10-30 14:51:37 +0000289; CHECK-LABEL: test_sub_1_cmp_1_setcc_ugt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000290; CHECK: # %bb.0: # %entry
Craig Topper4e13d4d2017-10-30 14:51:37 +0000291; CHECK-NEXT: lock subq $1, (%rdi)
292; CHECK-NEXT: seta %al
293; CHECK-NEXT: retq
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000294entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200295 %tmp0 = atomicrmw sub ptr %p, i64 1 seq_cst
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000296 %tmp1 = icmp ugt i64 %tmp0, 1
297 %tmp2 = zext i1 %tmp1 to i8
298 ret i8 %tmp2
299}
300
Nikita Popov2f448bf2022-06-22 14:33:12 +0200301define i8 @test_sub_1_cmp_1_setcc_sle(ptr %p) #0 {
Simon Pilgrim59fa4352021-06-30 16:22:53 +0100302; FASTINCDEC-LABEL: test_sub_1_cmp_1_setcc_sle:
303; FASTINCDEC: # %bb.0: # %entry
304; FASTINCDEC-NEXT: lock decq (%rdi)
305; FASTINCDEC-NEXT: setle %al
306; FASTINCDEC-NEXT: retq
307;
308; SLOWINCDEC-LABEL: test_sub_1_cmp_1_setcc_sle:
309; SLOWINCDEC: # %bb.0: # %entry
310; SLOWINCDEC-NEXT: lock subq $1, (%rdi)
311; SLOWINCDEC-NEXT: setle %al
312; SLOWINCDEC-NEXT: retq
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000313entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200314 %tmp0 = atomicrmw sub ptr %p, i64 1 seq_cst
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000315 %tmp1 = icmp sle i64 %tmp0, 1
316 %tmp2 = zext i1 %tmp1 to i8
317 ret i8 %tmp2
318}
319
Nikita Popov2f448bf2022-06-22 14:33:12 +0200320define i8 @test_sub_3_cmp_3_setcc_eq(ptr %p) #0 {
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000321; CHECK-LABEL: test_sub_3_cmp_3_setcc_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000322; CHECK: # %bb.0: # %entry
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000323; CHECK-NEXT: lock subq $3, (%rdi)
324; CHECK-NEXT: sete %al
325; CHECK-NEXT: retq
326entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200327 %tmp0 = atomicrmw sub ptr %p, i64 3 seq_cst
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000328 %tmp1 = icmp eq i64 %tmp0, 3
329 %tmp2 = zext i1 %tmp1 to i8
330 ret i8 %tmp2
331}
332
Nikita Popov2f448bf2022-06-22 14:33:12 +0200333define i8 @test_sub_3_cmp_3_setcc_uge(ptr %p) #0 {
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000334; CHECK-LABEL: test_sub_3_cmp_3_setcc_uge:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000335; CHECK: # %bb.0: # %entry
Simon Pilgrim59fa4352021-06-30 16:22:53 +0100336; CHECK-NEXT: lock subq $3, (%rdi)
337; CHECK-NEXT: setae %al
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000338; CHECK-NEXT: retq
339entry:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200340 %tmp0 = atomicrmw sub ptr %p, i64 3 seq_cst
Chandler Carruth63dd5e02017-08-21 08:45:19 +0000341 %tmp1 = icmp uge i64 %tmp0, 3
342 %tmp2 = zext i1 %tmp1 to i8
343 ret i8 %tmp2
344}
345
Ahmed Bougachab76e7252016-04-05 20:02:44 +0000346attributes #0 = { nounwind }