2
0

cmpxchg-weak.ll 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. ; RUN: opt -atomic-expand -S -mtriple=thumbv7s-apple-ios7.0 %s | FileCheck %s
  2. define i32 @test_cmpxchg_seq_cst(i32* %addr, i32 %desired, i32 %new) {
  3. ; CHECK-LABEL: @test_cmpxchg_seq_cst
  4. ; Intrinsic for "dmb ishst" is then expected
  5. ; CHECK: call void @llvm.arm.dmb(i32 10)
  6. ; CHECK: br label %[[START:.*]]
  7. ; CHECK: [[START]]:
  8. ; CHECK: [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
  9. ; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
  10. ; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[FAILURE_BB:.*]]
  11. ; CHECK: [[TRY_STORE]]:
  12. ; CHECK: [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
  13. ; CHECK: [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
  14. ; CHECK: br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB]]
  15. ; CHECK: [[SUCCESS_BB]]:
  16. ; CHECK: call void @llvm.arm.dmb(i32 11)
  17. ; CHECK: br label %[[END:.*]]
  18. ; CHECK: [[FAILURE_BB]]:
  19. ; CHECK: call void @llvm.arm.dmb(i32 11)
  20. ; CHECK: br label %[[END]]
  21. ; CHECK: [[END]]:
  22. ; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
  23. ; CHECK: ret i32 [[LOADED]]
  24. %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
  25. %oldval = extractvalue { i32, i1 } %pair, 0
  26. ret i32 %oldval
  27. }
  28. define i1 @test_cmpxchg_weak_fail(i32* %addr, i32 %desired, i32 %new) {
  29. ; CHECK-LABEL: @test_cmpxchg_weak_fail
  30. ; CHECK: call void @llvm.arm.dmb(i32 10)
  31. ; CHECK: br label %[[START:.*]]
  32. ; CHECK: [[START]]:
  33. ; CHECK: [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
  34. ; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
  35. ; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[FAILURE_BB:.*]]
  36. ; CHECK: [[TRY_STORE]]:
  37. ; CHECK: [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
  38. ; CHECK: [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
  39. ; CHECK: br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB:.*]]
  40. ; CHECK: [[SUCCESS_BB]]:
  41. ; CHECK: call void @llvm.arm.dmb(i32 11)
  42. ; CHECK: br label %[[END:.*]]
  43. ; CHECK: [[FAILURE_BB]]:
  44. ; CHECK-NOT: dmb
  45. ; CHECK: br label %[[END]]
  46. ; CHECK: [[END]]:
  47. ; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
  48. ; CHECK: ret i1 [[SUCCESS]]
  49. %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new seq_cst monotonic
  50. %oldval = extractvalue { i32, i1 } %pair, 1
  51. ret i1 %oldval
  52. }
  53. define i32 @test_cmpxchg_monotonic(i32* %addr, i32 %desired, i32 %new) {
  54. ; CHECK-LABEL: @test_cmpxchg_monotonic
  55. ; CHECK-NOT: dmb
  56. ; CHECK: br label %[[START:.*]]
  57. ; CHECK: [[START]]:
  58. ; CHECK: [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
  59. ; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
  60. ; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[FAILURE_BB:.*]]
  61. ; CHECK: [[TRY_STORE]]:
  62. ; CHECK: [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
  63. ; CHECK: [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
  64. ; CHECK: br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB:.*]]
  65. ; CHECK: [[SUCCESS_BB]]:
  66. ; CHECK-NOT: dmb
  67. ; CHECK: br label %[[END:.*]]
  68. ; CHECK: [[FAILURE_BB]]:
  69. ; CHECK-NOT: dmb
  70. ; CHECK: br label %[[END]]
  71. ; CHECK: [[END]]:
  72. ; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
  73. ; CHECK: ret i32 [[LOADED]]
  74. %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new monotonic monotonic
  75. %oldval = extractvalue { i32, i1 } %pair, 0
  76. ret i32 %oldval
  77. }