-
-
Save nikic/9025e91bde139fbb75225f4fbd0539e9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp | |
index b10cda06e3d3..afe612ca33ab 100644 | |
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp | |
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp | |
@@ -413,6 +413,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM, | |
setMinCmpXchgSizeInBits(32); | |
} else if (Subtarget.hasForcedAtomics()) { | |
setMaxAtomicSizeInBitsSupported(Subtarget.getXLen()); | |
+ setMinCmpXchgSizeInBits(32); | |
} else { | |
setMaxAtomicSizeInBitsSupported(0); | |
} | |
diff --git a/llvm/test/CodeGen/RISCV/forced-atomics32.ll b/llvm/test/CodeGen/RISCV/forced-atomics32.ll | |
index 54756349942e..e73e940102f6 100644 | |
--- a/llvm/test/CodeGen/RISCV/forced-atomics32.ll | |
+++ b/llvm/test/CodeGen/RISCV/forced-atomics32.ll | |
@@ -87,13 +87,43 @@ define i8 @cmpxchg8(ptr %p) nounwind { | |
; | |
; ATOMIC-LABEL: cmpxchg8: | |
; ATOMIC: # %bb.0: | |
-; ATOMIC-NEXT: addi sp, sp, -16 | |
-; ATOMIC-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
-; ATOMIC-NEXT: li a2, 1 | |
-; ATOMIC-NEXT: li a1, 0 | |
-; ATOMIC-NEXT: call __sync_val_compare_and_swap_1@plt | |
-; ATOMIC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
-; ATOMIC-NEXT: addi sp, sp, 16 | |
+; ATOMIC-NEXT: addi sp, sp, -32 | |
+; ATOMIC-NEXT: sw ra, 28(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s0, 24(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s1, 20(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s2, 16(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s3, 12(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s4, 8(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: andi s0, a0, -4 | |
+; ATOMIC-NEXT: slli a0, a0, 3 | |
+; ATOMIC-NEXT: andi s2, a0, 24 | |
+; ATOMIC-NEXT: li a1, 255 | |
+; ATOMIC-NEXT: sll a1, a1, a0 | |
+; ATOMIC-NEXT: lw a2, 0(s0) | |
+; ATOMIC-NEXT: not s3, a1 | |
+; ATOMIC-NEXT: li a1, 1 | |
+; ATOMIC-NEXT: sll s4, a1, a0 | |
+; ATOMIC-NEXT: and a1, a2, s3 | |
+; ATOMIC-NEXT: .LBB3_1: # %partword.cmpxchg.loop | |
+; ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1 | |
+; ATOMIC-NEXT: mv s1, a1 | |
+; ATOMIC-NEXT: or a2, a1, s4 | |
+; ATOMIC-NEXT: mv a0, s0 | |
+; ATOMIC-NEXT: call __sync_val_compare_and_swap_4@plt | |
+; ATOMIC-NEXT: beq a0, s1, .LBB3_3 | |
+; ATOMIC-NEXT: # %bb.2: # %partword.cmpxchg.failure | |
+; ATOMIC-NEXT: # in Loop: Header=BB3_1 Depth=1 | |
+; ATOMIC-NEXT: and a1, a0, s3 | |
+; ATOMIC-NEXT: bne s1, a1, .LBB3_1 | |
+; ATOMIC-NEXT: .LBB3_3: # %partword.cmpxchg.end | |
+; ATOMIC-NEXT: srl a0, a0, s2 | |
+; ATOMIC-NEXT: lw ra, 28(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s0, 24(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s1, 20(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s2, 16(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s3, 12(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s4, 8(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: addi sp, sp, 32 | |
; ATOMIC-NEXT: ret | |
%res = cmpxchg ptr %p, i8 0, i8 1 seq_cst seq_cst | |
%res.0 = extractvalue { i8, i1 } %res, 0 | |
@@ -185,13 +215,44 @@ define i16 @cmpxchg16(ptr %p) nounwind { | |
; | |
; ATOMIC-LABEL: cmpxchg16: | |
; ATOMIC: # %bb.0: | |
-; ATOMIC-NEXT: addi sp, sp, -16 | |
-; ATOMIC-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
-; ATOMIC-NEXT: li a2, 1 | |
-; ATOMIC-NEXT: li a1, 0 | |
-; ATOMIC-NEXT: call __sync_val_compare_and_swap_2@plt | |
-; ATOMIC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
-; ATOMIC-NEXT: addi sp, sp, 16 | |
+; ATOMIC-NEXT: addi sp, sp, -32 | |
+; ATOMIC-NEXT: sw ra, 28(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s0, 24(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s1, 20(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s2, 16(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s3, 12(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: sw s4, 8(sp) # 4-byte Folded Spill | |
+; ATOMIC-NEXT: andi s0, a0, -4 | |
+; ATOMIC-NEXT: slli a0, a0, 3 | |
+; ATOMIC-NEXT: andi s2, a0, 24 | |
+; ATOMIC-NEXT: lui a1, 16 | |
+; ATOMIC-NEXT: addi a1, a1, -1 | |
+; ATOMIC-NEXT: sll a1, a1, a0 | |
+; ATOMIC-NEXT: lw a2, 0(s0) | |
+; ATOMIC-NEXT: not s3, a1 | |
+; ATOMIC-NEXT: li a1, 1 | |
+; ATOMIC-NEXT: sll s4, a1, a0 | |
+; ATOMIC-NEXT: and a1, a2, s3 | |
+; ATOMIC-NEXT: .LBB7_1: # %partword.cmpxchg.loop | |
+; ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1 | |
+; ATOMIC-NEXT: mv s1, a1 | |
+; ATOMIC-NEXT: or a2, a1, s4 | |
+; ATOMIC-NEXT: mv a0, s0 | |
+; ATOMIC-NEXT: call __sync_val_compare_and_swap_4@plt | |
+; ATOMIC-NEXT: beq a0, s1, .LBB7_3 | |
+; ATOMIC-NEXT: # %bb.2: # %partword.cmpxchg.failure | |
+; ATOMIC-NEXT: # in Loop: Header=BB7_1 Depth=1 | |
+; ATOMIC-NEXT: and a1, a0, s3 | |
+; ATOMIC-NEXT: bne s1, a1, .LBB7_1 | |
+; ATOMIC-NEXT: .LBB7_3: # %partword.cmpxchg.end | |
+; ATOMIC-NEXT: srl a0, a0, s2 | |
+; ATOMIC-NEXT: lw ra, 28(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s0, 24(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s1, 20(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s2, 16(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s3, 12(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: lw s4, 8(sp) # 4-byte Folded Reload | |
+; ATOMIC-NEXT: addi sp, sp, 32 | |
; ATOMIC-NEXT: ret | |
%res = cmpxchg ptr %p, i16 0, i16 1 seq_cst seq_cst | |
%res.0 = extractvalue { i16, i1 } %res, 0 | |
diff --git a/llvm/test/CodeGen/RISCV/forced-atomics64.ll b/llvm/test/CodeGen/RISCV/forced-atomics64.ll | |
index bf80ea962e46..ba486b299459 100644 | |
--- a/llvm/test/CodeGen/RISCV/forced-atomics64.ll | |
+++ b/llvm/test/CodeGen/RISCV/forced-atomics64.ll | |
@@ -87,13 +87,44 @@ define i8 @cmpxchg8(ptr %p) nounwind { | |
; | |
; ATOMIC-LABEL: cmpxchg8: | |
; ATOMIC: # %bb.0: | |
-; ATOMIC-NEXT: addi sp, sp, -16 | |
-; ATOMIC-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: addi sp, sp, -48 | |
+; ATOMIC-NEXT: sd ra, 40(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s0, 32(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s1, 24(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s2, 16(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s3, 8(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s4, 0(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: andi s0, a0, -4 | |
+; ATOMIC-NEXT: slliw a0, a0, 3 | |
+; ATOMIC-NEXT: li a1, 255 | |
+; ATOMIC-NEXT: sllw a1, a1, a0 | |
; ATOMIC-NEXT: li a2, 1 | |
-; ATOMIC-NEXT: li a1, 0 | |
-; ATOMIC-NEXT: call __sync_val_compare_and_swap_1@plt | |
-; ATOMIC-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
-; ATOMIC-NEXT: addi sp, sp, 16 | |
+; ATOMIC-NEXT: lw a3, 0(s0) | |
+; ATOMIC-NEXT: sllw s3, a2, a0 | |
+; ATOMIC-NEXT: andi s2, a0, 24 | |
+; ATOMIC-NEXT: not s4, a1 | |
+; ATOMIC-NEXT: and a1, a3, s4 | |
+; ATOMIC-NEXT: .LBB3_1: # %partword.cmpxchg.loop | |
+; ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1 | |
+; ATOMIC-NEXT: or a2, a1, s3 | |
+; ATOMIC-NEXT: sext.w s1, a1 | |
+; ATOMIC-NEXT: mv a0, s0 | |
+; ATOMIC-NEXT: mv a1, s1 | |
+; ATOMIC-NEXT: call __sync_val_compare_and_swap_4@plt | |
+; ATOMIC-NEXT: beq a0, s1, .LBB3_3 | |
+; ATOMIC-NEXT: # %bb.2: # %partword.cmpxchg.failure | |
+; ATOMIC-NEXT: # in Loop: Header=BB3_1 Depth=1 | |
+; ATOMIC-NEXT: and a1, a0, s4 | |
+; ATOMIC-NEXT: bne s1, a1, .LBB3_1 | |
+; ATOMIC-NEXT: .LBB3_3: # %partword.cmpxchg.end | |
+; ATOMIC-NEXT: srlw a0, a0, s2 | |
+; ATOMIC-NEXT: ld ra, 40(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s0, 32(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s1, 24(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s2, 16(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s3, 8(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s4, 0(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: addi sp, sp, 48 | |
; ATOMIC-NEXT: ret | |
%res = cmpxchg ptr %p, i8 0, i8 1 seq_cst seq_cst | |
%res.0 = extractvalue { i8, i1 } %res, 0 | |
@@ -185,13 +216,45 @@ define i16 @cmpxchg16(ptr %p) nounwind { | |
; | |
; ATOMIC-LABEL: cmpxchg16: | |
; ATOMIC: # %bb.0: | |
-; ATOMIC-NEXT: addi sp, sp, -16 | |
-; ATOMIC-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: addi sp, sp, -48 | |
+; ATOMIC-NEXT: sd ra, 40(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s0, 32(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s1, 24(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s2, 16(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s3, 8(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: sd s4, 0(sp) # 8-byte Folded Spill | |
+; ATOMIC-NEXT: andi s0, a0, -4 | |
+; ATOMIC-NEXT: slliw a0, a0, 3 | |
+; ATOMIC-NEXT: lui a1, 16 | |
+; ATOMIC-NEXT: addiw a1, a1, -1 | |
+; ATOMIC-NEXT: sllw a1, a1, a0 | |
; ATOMIC-NEXT: li a2, 1 | |
-; ATOMIC-NEXT: li a1, 0 | |
-; ATOMIC-NEXT: call __sync_val_compare_and_swap_2@plt | |
-; ATOMIC-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
-; ATOMIC-NEXT: addi sp, sp, 16 | |
+; ATOMIC-NEXT: lw a3, 0(s0) | |
+; ATOMIC-NEXT: sllw s3, a2, a0 | |
+; ATOMIC-NEXT: andi s2, a0, 24 | |
+; ATOMIC-NEXT: not s4, a1 | |
+; ATOMIC-NEXT: and a1, a3, s4 | |
+; ATOMIC-NEXT: .LBB7_1: # %partword.cmpxchg.loop | |
+; ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1 | |
+; ATOMIC-NEXT: or a2, a1, s3 | |
+; ATOMIC-NEXT: sext.w s1, a1 | |
+; ATOMIC-NEXT: mv a0, s0 | |
+; ATOMIC-NEXT: mv a1, s1 | |
+; ATOMIC-NEXT: call __sync_val_compare_and_swap_4@plt | |
+; ATOMIC-NEXT: beq a0, s1, .LBB7_3 | |
+; ATOMIC-NEXT: # %bb.2: # %partword.cmpxchg.failure | |
+; ATOMIC-NEXT: # in Loop: Header=BB7_1 Depth=1 | |
+; ATOMIC-NEXT: and a1, a0, s4 | |
+; ATOMIC-NEXT: bne s1, a1, .LBB7_1 | |
+; ATOMIC-NEXT: .LBB7_3: # %partword.cmpxchg.end | |
+; ATOMIC-NEXT: srlw a0, a0, s2 | |
+; ATOMIC-NEXT: ld ra, 40(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s0, 32(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s1, 24(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s2, 16(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s3, 8(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: ld s4, 0(sp) # 8-byte Folded Reload | |
+; ATOMIC-NEXT: addi sp, sp, 48 | |
; ATOMIC-NEXT: ret | |
%res = cmpxchg ptr %p, i16 0, i16 1 seq_cst seq_cst | |
%res.0 = extractvalue { i16, i1 } %res, 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment