Skip to content

Commit 65e0dc6

Browse files
committed
[RISCV] Add test cases showing missed opportunity to remove sext.w after amocas.w. NFC
1 parent 84be954 commit 65e0dc6

File tree

1 file changed

+196
-48
lines changed

1 file changed

+196
-48
lines changed

llvm/test/CodeGen/RISCV/atomic-signext.ll

Lines changed: 196 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
33
; RUN: | FileCheck -check-prefix=RV32I %s
44
; 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
68
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
79
; RUN: | FileCheck -check-prefix=RV64I %s
810
; 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
1014

1115
define signext i8 @atomic_load_i8_unordered(ptr %a) nounwind {
1216
; RV32I-LABEL: atomic_load_i8_unordered:
@@ -4095,17 +4099,23 @@ define signext i32 @cmpxchg_i32_monotonic_monotonic_val0(ptr %ptr, i32 signext %
40954099
; RV32I-NEXT: addi sp, sp, 16
40964100
; RV32I-NEXT: ret
40974101
;
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
41094119
;
41104120
; RV64I-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
41114121
; RV64I: # %bb.0:
@@ -4121,17 +4131,23 @@ define signext i32 @cmpxchg_i32_monotonic_monotonic_val0(ptr %ptr, i32 signext %
41214131
; RV64I-NEXT: addi sp, sp, 16
41224132
; RV64I-NEXT: ret
41234133
;
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
41354151
%1 = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
41364152
%2 = extractvalue { i32, i1 } %1, 0
41374153
ret i32 %2
@@ -4151,18 +4167,26 @@ define i1 @cmpxchg_i32_monotonic_monotonic_val1(ptr %ptr, i32 signext %cmp, i32
41514167
; RV32I-NEXT: addi sp, sp, 16
41524168
; RV32I-NEXT: ret
41534169
;
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
41664190
;
41674191
; RV64I-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
41684192
; RV64I: # %bb.0:
@@ -4177,18 +4201,26 @@ define i1 @cmpxchg_i32_monotonic_monotonic_val1(ptr %ptr, i32 signext %cmp, i32
41774201
; RV64I-NEXT: addi sp, sp, 16
41784202
; RV64I-NEXT: ret
41794203
;
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
41924224
%1 = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
41934225
%2 = extractvalue { i32, i1 } %1, 1
41944226
ret i1 %2
@@ -5398,3 +5430,119 @@ merge:
53985430
ret i32 %4
53995431
}
54005432
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

Comments
 (0)