atomic-swap.ll 943 B

12345678910111213141516171819202122232425262728
  1. ; RUN: opt < %s -loweratomic -S | FileCheck %s
  2. define i8 @cmpswap() {
  3. ; CHECK-LABEL: @cmpswap(
  4. %i = alloca i8
  5. %pair = cmpxchg i8* %i, i8 0, i8 42 monotonic monotonic
  6. %j = extractvalue { i8, i1 } %pair, 0
  7. ; CHECK: [[OLDVAL:%[a-z0-9]+]] = load i8, i8* [[ADDR:%[a-z0-9]+]]
  8. ; CHECK-NEXT: [[SAME:%[a-z0-9]+]] = icmp eq i8 [[OLDVAL]], 0
  9. ; CHECK-NEXT: [[TO_STORE:%[a-z0-9]+]] = select i1 [[SAME]], i8 42, i8 [[OLDVAL]]
  10. ; CHECK-NEXT: store i8 [[TO_STORE]], i8* [[ADDR]]
  11. ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = insertvalue { i8, i1 } undef, i8 [[OLDVAL]], 0
  12. ; CHECK-NEXT: [[RES:%[a-z0-9]+]] = insertvalue { i8, i1 } [[TMP]], i1 [[SAME]], 1
  13. ; CHECK-NEXT: [[VAL:%[a-z0-9]+]] = extractvalue { i8, i1 } [[RES]], 0
  14. ret i8 %j
  15. ; CHECK: ret i8 [[VAL]]
  16. }
  17. define i8 @swap() {
  18. ; CHECK-LABEL: @swap(
  19. %i = alloca i8
  20. %j = atomicrmw xchg i8* %i, i8 42 monotonic
  21. ; CHECK: [[INST:%[a-z0-9]+]] = load
  22. ; CHECK-NEXT: store
  23. ret i8 %j
  24. ; CHECK: ret i8 [[INST]]
  25. }