2
2
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3
3
; RUN: | FileCheck -check-prefix=RV32I %s
4
4
; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \
5
- ; RUN: | FileCheck -check-prefix=RV32IA %s
5
+ ; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-NOZACAS %s
6
+ ; RUN: llc -mtriple=riscv32 -mattr=+a,+experimental-zacas -verify-machineinstrs < %s \
7
+ ; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS %s
6
8
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
7
9
; RUN: | FileCheck -check-prefix=RV64I %s
8
10
; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \
9
- ; RUN: | FileCheck -check-prefix=RV64IA %s
11
+ ; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-NOZACAS %s
12
+ ; RUN: llc -mtriple=riscv64 -mattr=+a,+experimental-zacas -verify-machineinstrs < %s \
13
+ ; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS %s
10
14
11
15
define signext i8 @atomic_load_i8_unordered (ptr %a ) nounwind {
12
16
; RV32I-LABEL: atomic_load_i8_unordered:
@@ -4095,17 +4099,23 @@ define signext i32 @cmpxchg_i32_monotonic_monotonic_val0(ptr %ptr, i32 signext %
4095
4099
; RV32I-NEXT: addi sp, sp, 16
4096
4100
; RV32I-NEXT: ret
4097
4101
;
4098
- ; RV32IA-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4099
- ; RV32IA: # %bb.0:
4100
- ; RV32IA-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
4101
- ; RV32IA-NEXT: lr.w a3, (a0)
4102
- ; RV32IA-NEXT: bne a3, a1, .LBB51_3
4103
- ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
4104
- ; RV32IA-NEXT: sc.w a4, a2, (a0)
4105
- ; RV32IA-NEXT: bnez a4, .LBB51_1
4106
- ; RV32IA-NEXT: .LBB51_3:
4107
- ; RV32IA-NEXT: mv a0, a3
4108
- ; RV32IA-NEXT: ret
4102
+ ; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4103
+ ; RV32IA-NOZACAS: # %bb.0:
4104
+ ; RV32IA-NOZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
4105
+ ; RV32IA-NOZACAS-NEXT: lr.w a3, (a0)
4106
+ ; RV32IA-NOZACAS-NEXT: bne a3, a1, .LBB51_3
4107
+ ; RV32IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
4108
+ ; RV32IA-NOZACAS-NEXT: sc.w a4, a2, (a0)
4109
+ ; RV32IA-NOZACAS-NEXT: bnez a4, .LBB51_1
4110
+ ; RV32IA-NOZACAS-NEXT: .LBB51_3:
4111
+ ; RV32IA-NOZACAS-NEXT: mv a0, a3
4112
+ ; RV32IA-NOZACAS-NEXT: ret
4113
+ ;
4114
+ ; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4115
+ ; RV32IA-ZACAS: # %bb.0:
4116
+ ; RV32IA-ZACAS-NEXT: amocas.w a1, a2, (a0)
4117
+ ; RV32IA-ZACAS-NEXT: mv a0, a1
4118
+ ; RV32IA-ZACAS-NEXT: ret
4109
4119
;
4110
4120
; RV64I-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4111
4121
; RV64I: # %bb.0:
@@ -4121,17 +4131,23 @@ define signext i32 @cmpxchg_i32_monotonic_monotonic_val0(ptr %ptr, i32 signext %
4121
4131
; RV64I-NEXT: addi sp, sp, 16
4122
4132
; RV64I-NEXT: ret
4123
4133
;
4124
- ; RV64IA-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4125
- ; RV64IA: # %bb.0:
4126
- ; RV64IA-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
4127
- ; RV64IA-NEXT: lr.w a3, (a0)
4128
- ; RV64IA-NEXT: bne a3, a1, .LBB51_3
4129
- ; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
4130
- ; RV64IA-NEXT: sc.w a4, a2, (a0)
4131
- ; RV64IA-NEXT: bnez a4, .LBB51_1
4132
- ; RV64IA-NEXT: .LBB51_3:
4133
- ; RV64IA-NEXT: mv a0, a3
4134
- ; RV64IA-NEXT: ret
4134
+ ; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4135
+ ; RV64IA-NOZACAS: # %bb.0:
4136
+ ; RV64IA-NOZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
4137
+ ; RV64IA-NOZACAS-NEXT: lr.w a3, (a0)
4138
+ ; RV64IA-NOZACAS-NEXT: bne a3, a1, .LBB51_3
4139
+ ; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
4140
+ ; RV64IA-NOZACAS-NEXT: sc.w a4, a2, (a0)
4141
+ ; RV64IA-NOZACAS-NEXT: bnez a4, .LBB51_1
4142
+ ; RV64IA-NOZACAS-NEXT: .LBB51_3:
4143
+ ; RV64IA-NOZACAS-NEXT: mv a0, a3
4144
+ ; RV64IA-NOZACAS-NEXT: ret
4145
+ ;
4146
+ ; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4147
+ ; RV64IA-ZACAS: # %bb.0:
4148
+ ; RV64IA-ZACAS-NEXT: amocas.w a1, a2, (a0)
4149
+ ; RV64IA-ZACAS-NEXT: mv a0, a1
4150
+ ; RV64IA-ZACAS-NEXT: ret
4135
4151
%1 = cmpxchg ptr %ptr , i32 %cmp , i32 %val monotonic monotonic
4136
4152
%2 = extractvalue { i32 , i1 } %1 , 0
4137
4153
ret i32 %2
@@ -4151,18 +4167,26 @@ define i1 @cmpxchg_i32_monotonic_monotonic_val1(ptr %ptr, i32 signext %cmp, i32
4151
4167
; RV32I-NEXT: addi sp, sp, 16
4152
4168
; RV32I-NEXT: ret
4153
4169
;
4154
- ; RV32IA-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4155
- ; RV32IA: # %bb.0:
4156
- ; RV32IA-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
4157
- ; RV32IA-NEXT: lr.w a3, (a0)
4158
- ; RV32IA-NEXT: bne a3, a1, .LBB52_3
4159
- ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
4160
- ; RV32IA-NEXT: sc.w a4, a2, (a0)
4161
- ; RV32IA-NEXT: bnez a4, .LBB52_1
4162
- ; RV32IA-NEXT: .LBB52_3:
4163
- ; RV32IA-NEXT: xor a1, a3, a1
4164
- ; RV32IA-NEXT: seqz a0, a1
4165
- ; RV32IA-NEXT: ret
4170
+ ; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4171
+ ; RV32IA-NOZACAS: # %bb.0:
4172
+ ; RV32IA-NOZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
4173
+ ; RV32IA-NOZACAS-NEXT: lr.w a3, (a0)
4174
+ ; RV32IA-NOZACAS-NEXT: bne a3, a1, .LBB52_3
4175
+ ; RV32IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
4176
+ ; RV32IA-NOZACAS-NEXT: sc.w a4, a2, (a0)
4177
+ ; RV32IA-NOZACAS-NEXT: bnez a4, .LBB52_1
4178
+ ; RV32IA-NOZACAS-NEXT: .LBB52_3:
4179
+ ; RV32IA-NOZACAS-NEXT: xor a1, a3, a1
4180
+ ; RV32IA-NOZACAS-NEXT: seqz a0, a1
4181
+ ; RV32IA-NOZACAS-NEXT: ret
4182
+ ;
4183
+ ; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4184
+ ; RV32IA-ZACAS: # %bb.0:
4185
+ ; RV32IA-ZACAS-NEXT: mv a3, a1
4186
+ ; RV32IA-ZACAS-NEXT: amocas.w a3, a2, (a0)
4187
+ ; RV32IA-ZACAS-NEXT: xor a1, a3, a1
4188
+ ; RV32IA-ZACAS-NEXT: seqz a0, a1
4189
+ ; RV32IA-ZACAS-NEXT: ret
4166
4190
;
4167
4191
; RV64I-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4168
4192
; RV64I: # %bb.0:
@@ -4177,18 +4201,26 @@ define i1 @cmpxchg_i32_monotonic_monotonic_val1(ptr %ptr, i32 signext %cmp, i32
4177
4201
; RV64I-NEXT: addi sp, sp, 16
4178
4202
; RV64I-NEXT: ret
4179
4203
;
4180
- ; RV64IA-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4181
- ; RV64IA: # %bb.0:
4182
- ; RV64IA-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
4183
- ; RV64IA-NEXT: lr.w a3, (a0)
4184
- ; RV64IA-NEXT: bne a3, a1, .LBB52_3
4185
- ; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
4186
- ; RV64IA-NEXT: sc.w a4, a2, (a0)
4187
- ; RV64IA-NEXT: bnez a4, .LBB52_1
4188
- ; RV64IA-NEXT: .LBB52_3:
4189
- ; RV64IA-NEXT: xor a1, a3, a1
4190
- ; RV64IA-NEXT: seqz a0, a1
4191
- ; RV64IA-NEXT: ret
4204
+ ; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4205
+ ; RV64IA-NOZACAS: # %bb.0:
4206
+ ; RV64IA-NOZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
4207
+ ; RV64IA-NOZACAS-NEXT: lr.w a3, (a0)
4208
+ ; RV64IA-NOZACAS-NEXT: bne a3, a1, .LBB52_3
4209
+ ; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
4210
+ ; RV64IA-NOZACAS-NEXT: sc.w a4, a2, (a0)
4211
+ ; RV64IA-NOZACAS-NEXT: bnez a4, .LBB52_1
4212
+ ; RV64IA-NOZACAS-NEXT: .LBB52_3:
4213
+ ; RV64IA-NOZACAS-NEXT: xor a1, a3, a1
4214
+ ; RV64IA-NOZACAS-NEXT: seqz a0, a1
4215
+ ; RV64IA-NOZACAS-NEXT: ret
4216
+ ;
4217
+ ; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4218
+ ; RV64IA-ZACAS: # %bb.0:
4219
+ ; RV64IA-ZACAS-NEXT: mv a3, a1
4220
+ ; RV64IA-ZACAS-NEXT: amocas.w a3, a2, (a0)
4221
+ ; RV64IA-ZACAS-NEXT: xor a1, a3, a1
4222
+ ; RV64IA-ZACAS-NEXT: seqz a0, a1
4223
+ ; RV64IA-ZACAS-NEXT: ret
4192
4224
%1 = cmpxchg ptr %ptr , i32 %cmp , i32 %val monotonic monotonic
4193
4225
%2 = extractvalue { i32 , i1 } %1 , 1
4194
4226
ret i1 %2
@@ -5398,3 +5430,119 @@ merge:
5398
5430
ret i32 %4
5399
5431
}
5400
5432
declare i32 @llvm.umin.i32 (i32 , i32 )
5433
+
5434
+ define signext i32 @cmpxchg_i32_monotonic_crossbb (ptr %ptr , i32 signext %cmp , i32 signext %val , i1 zeroext %c ) nounwind {
5435
+ ; RV32I-LABEL: cmpxchg_i32_monotonic_crossbb:
5436
+ ; RV32I: # %bb.0:
5437
+ ; RV32I-NEXT: beqz a3, .LBB64_2
5438
+ ; RV32I-NEXT: # %bb.1: # %then
5439
+ ; RV32I-NEXT: addi sp, sp, -16
5440
+ ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
5441
+ ; RV32I-NEXT: sw a1, 8(sp)
5442
+ ; RV32I-NEXT: addi a1, sp, 8
5443
+ ; RV32I-NEXT: li a3, 5
5444
+ ; RV32I-NEXT: li a4, 5
5445
+ ; RV32I-NEXT: call __atomic_compare_exchange_4
5446
+ ; RV32I-NEXT: lw a0, 8(sp)
5447
+ ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
5448
+ ; RV32I-NEXT: addi sp, sp, 16
5449
+ ; RV32I-NEXT: ret
5450
+ ; RV32I-NEXT: .LBB64_2: # %else
5451
+ ; RV32I-NEXT: lw a0, 0(a0)
5452
+ ; RV32I-NEXT: ret
5453
+ ;
5454
+ ; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_crossbb:
5455
+ ; RV32IA-NOZACAS: # %bb.0:
5456
+ ; RV32IA-NOZACAS-NEXT: mv a4, a0
5457
+ ; RV32IA-NOZACAS-NEXT: beqz a3, .LBB64_2
5458
+ ; RV32IA-NOZACAS-NEXT: # %bb.1: # %then
5459
+ ; RV32IA-NOZACAS-NEXT: .LBB64_3: # %then
5460
+ ; RV32IA-NOZACAS-NEXT: # =>This Inner Loop Header: Depth=1
5461
+ ; RV32IA-NOZACAS-NEXT: lr.w.aqrl a0, (a4)
5462
+ ; RV32IA-NOZACAS-NEXT: bne a0, a1, .LBB64_5
5463
+ ; RV32IA-NOZACAS-NEXT: # %bb.4: # %then
5464
+ ; RV32IA-NOZACAS-NEXT: # in Loop: Header=BB64_3 Depth=1
5465
+ ; RV32IA-NOZACAS-NEXT: sc.w.rl a3, a2, (a4)
5466
+ ; RV32IA-NOZACAS-NEXT: bnez a3, .LBB64_3
5467
+ ; RV32IA-NOZACAS-NEXT: .LBB64_5: # %then
5468
+ ; RV32IA-NOZACAS-NEXT: ret
5469
+ ; RV32IA-NOZACAS-NEXT: .LBB64_2: # %else
5470
+ ; RV32IA-NOZACAS-NEXT: lw a0, 0(a4)
5471
+ ; RV32IA-NOZACAS-NEXT: ret
5472
+ ;
5473
+ ; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_crossbb:
5474
+ ; RV32IA-ZACAS: # %bb.0:
5475
+ ; RV32IA-ZACAS-NEXT: beqz a3, .LBB64_2
5476
+ ; RV32IA-ZACAS-NEXT: # %bb.1: # %then
5477
+ ; RV32IA-ZACAS-NEXT: amocas.w.aqrl a1, a2, (a0)
5478
+ ; RV32IA-ZACAS-NEXT: mv a0, a1
5479
+ ; RV32IA-ZACAS-NEXT: ret
5480
+ ; RV32IA-ZACAS-NEXT: .LBB64_2: # %else
5481
+ ; RV32IA-ZACAS-NEXT: lw a0, 0(a0)
5482
+ ; RV32IA-ZACAS-NEXT: ret
5483
+ ;
5484
+ ; RV64I-LABEL: cmpxchg_i32_monotonic_crossbb:
5485
+ ; RV64I: # %bb.0:
5486
+ ; RV64I-NEXT: beqz a3, .LBB64_2
5487
+ ; RV64I-NEXT: # %bb.1: # %then
5488
+ ; RV64I-NEXT: addi sp, sp, -16
5489
+ ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
5490
+ ; RV64I-NEXT: sw a1, 4(sp)
5491
+ ; RV64I-NEXT: addi a1, sp, 4
5492
+ ; RV64I-NEXT: li a3, 5
5493
+ ; RV64I-NEXT: li a4, 5
5494
+ ; RV64I-NEXT: call __atomic_compare_exchange_4
5495
+ ; RV64I-NEXT: lw a0, 4(sp)
5496
+ ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
5497
+ ; RV64I-NEXT: addi sp, sp, 16
5498
+ ; RV64I-NEXT: ret
5499
+ ; RV64I-NEXT: .LBB64_2: # %else
5500
+ ; RV64I-NEXT: lw a0, 0(a0)
5501
+ ; RV64I-NEXT: ret
5502
+ ;
5503
+ ; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_crossbb:
5504
+ ; RV64IA-NOZACAS: # %bb.0:
5505
+ ; RV64IA-NOZACAS-NEXT: beqz a3, .LBB64_2
5506
+ ; RV64IA-NOZACAS-NEXT: # %bb.1: # %then
5507
+ ; RV64IA-NOZACAS-NEXT: .LBB64_3: # %then
5508
+ ; RV64IA-NOZACAS-NEXT: # =>This Inner Loop Header: Depth=1
5509
+ ; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a0)
5510
+ ; RV64IA-NOZACAS-NEXT: bne a3, a1, .LBB64_5
5511
+ ; RV64IA-NOZACAS-NEXT: # %bb.4: # %then
5512
+ ; RV64IA-NOZACAS-NEXT: # in Loop: Header=BB64_3 Depth=1
5513
+ ; RV64IA-NOZACAS-NEXT: sc.w.rl a4, a2, (a0)
5514
+ ; RV64IA-NOZACAS-NEXT: bnez a4, .LBB64_3
5515
+ ; RV64IA-NOZACAS-NEXT: .LBB64_5: # %then
5516
+ ; RV64IA-NOZACAS-NEXT: sext.w a0, a3
5517
+ ; RV64IA-NOZACAS-NEXT: ret
5518
+ ; RV64IA-NOZACAS-NEXT: .LBB64_2: # %else
5519
+ ; RV64IA-NOZACAS-NEXT: lw a3, 0(a0)
5520
+ ; RV64IA-NOZACAS-NEXT: sext.w a0, a3
5521
+ ; RV64IA-NOZACAS-NEXT: ret
5522
+ ;
5523
+ ; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_crossbb:
5524
+ ; RV64IA-ZACAS: # %bb.0:
5525
+ ; RV64IA-ZACAS-NEXT: beqz a3, .LBB64_2
5526
+ ; RV64IA-ZACAS-NEXT: # %bb.1: # %then
5527
+ ; RV64IA-ZACAS-NEXT: amocas.w.aqrl a1, a2, (a0)
5528
+ ; RV64IA-ZACAS-NEXT: sext.w a0, a1
5529
+ ; RV64IA-ZACAS-NEXT: ret
5530
+ ; RV64IA-ZACAS-NEXT: .LBB64_2: # %else
5531
+ ; RV64IA-ZACAS-NEXT: lw a1, 0(a0)
5532
+ ; RV64IA-ZACAS-NEXT: sext.w a0, a1
5533
+ ; RV64IA-ZACAS-NEXT: ret
5534
+ br i1 %c , label %then , label %else
5535
+
5536
+ then:
5537
+ %1 = cmpxchg ptr %ptr , i32 %cmp , i32 %val seq_cst seq_cst
5538
+ %2 = extractvalue { i32 , i1 } %1 , 0
5539
+ br label %merge
5540
+
5541
+ else:
5542
+ %3 = load i32 , ptr %ptr , align 4
5543
+ br label %merge
5544
+
5545
+ merge:
5546
+ %4 = phi i32 [ %2 , %then ], [ %3 , %else ]
5547
+ ret i32 %4
5548
+ }
0 commit comments