Skip to content

Instantly share code, notes, and snippets.

@nikic

nikic/riscv.diff Secret

Created July 27, 2022 15:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nikic/9025e91bde139fbb75225f4fbd0539e9 to your computer and use it in GitHub Desktop.
Save nikic/9025e91bde139fbb75225f4fbd0539e9 to your computer and use it in GitHub Desktop.
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