| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s |
| ; RUN: llc -mtriple=aarch64-unknown-linux-gnu -global-isel < %s | FileCheck %s |
| |
| ; Make sure postinc/preinc addressing mode is not used for volatile accesses, |
| ; see https://github.com/llvm/llvm-project/issues/173014. |
| |
| define ptr @volatile_store_postinc(ptr %p) { |
| ; CHECK-LABEL: volatile_store_postinc: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: mov x8, x0 |
| ; CHECK-NEXT: add x0, x0, #4 |
| ; CHECK-NEXT: str wzr, [x8] |
| ; CHECK-NEXT: ret |
| store volatile i32 0, ptr %p |
| %gep = getelementptr i8, ptr %p, i64 4 |
| ret ptr %gep |
| } |
| |
| define ptr @volatile_load_postinc(ptr %p) { |
| ; CHECK-LABEL: volatile_load_postinc: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: ldr wzr, [x0] |
| ; CHECK-NEXT: add x0, x0, #4 |
| ; CHECK-NEXT: ret |
| load volatile i32, ptr %p |
| %gep = getelementptr i8, ptr %p, i64 4 |
| ret ptr %gep |
| } |
| |
| define ptr @volatile_store_preinc(ptr %p) { |
| ; CHECK-LABEL: volatile_store_preinc: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: mov x8, x0 |
| ; CHECK-NEXT: add x0, x0, #4 |
| ; CHECK-NEXT: str wzr, [x8, #4] |
| ; CHECK-NEXT: ret |
| %gep = getelementptr i8, ptr %p, i64 4 |
| store volatile i32 0, ptr %gep |
| ret ptr %gep |
| } |
| |
| define ptr @volatile_load_preinc(ptr %p) { |
| ; CHECK-LABEL: volatile_load_preinc: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: ldr wzr, [x0, #4] |
| ; CHECK-NEXT: add x0, x0, #4 |
| ; CHECK-NEXT: ret |
| %gep = getelementptr i8, ptr %p, i64 4 |
| load volatile i32, ptr %gep |
| ret ptr %gep |
| } |