65 lines · plain
1; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lse -O0 | FileCheck %s2; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lse -O1 | FileCheck %s3 4; When their destination register is WZR/ZZR, SWP operations are not regarded as5; a read for the purpose of a DMB.LD in the AArch64 memory model.6; This test ensures that the AArch64DeadRegisterDefinitions pass does not7; replace the desitnation register of SWP instructions with the zero register8; when the read value is unused.9 10define dso_local i32 @atomic_exchange_monotonic(ptr %ptr, ptr %ptr2, i32 %value) {11; CHECK-LABEL: atomic_exchange_monotonic:12; CHECK: // %bb.0:13; CHECK-NEXT: swp14; CHECK-NOT: wzr15; CHECK-NEXT: dmb ishld16; CHECK-NEXT: ldr w0, [x1]17; CHECK-NEXT: ret18 %r0 = atomicrmw xchg ptr %ptr, i32 %value monotonic19 fence acquire20 %r1 = load atomic i32, ptr %ptr2 monotonic, align 421 ret i32 %r122}23 24define dso_local i32 @atomic_exchange_acquire(ptr %ptr, ptr %ptr2, i32 %value) {25; CHECK-LABEL: atomic_exchange_acquire:26; CHECK: // %bb.0:27; CHECK-NEXT: swpa28; CHECK-NOT: wzr29; CHECK-NEXT: dmb ishld30; CHECK-NEXT: ldr w0, [x1]31; CHECK-NEXT: ret32 %r0 = atomicrmw xchg ptr %ptr, i32 %value acquire33 fence acquire34 %r1 = load atomic i32, ptr %ptr2 monotonic, align 435 ret i32 %r136}37 38define dso_local i32 @atomic_exchange_release(ptr %ptr, ptr %ptr2, i32 %value) {39; CHECK-LABEL: atomic_exchange_release:40; CHECK: // %bb.0:41; CHECK-NEXT: swpl42; CHECK-NOT: wzr43; CHECK-NEXT: dmb ishld44; CHECK-NEXT: ldr w0, [x1]45; CHECK-NEXT: ret46 %r0 = atomicrmw xchg ptr %ptr, i32 %value release47 fence acquire48 %r1 = load atomic i32, ptr %ptr2 monotonic, align 449 ret i32 %r150}51 52define dso_local i32 @atomic_exchange_acquire_release(ptr %ptr, ptr %ptr2, i32 %value) {53; CHECK-LABEL: atomic_exchange_acquire_release:54; CHECK: // %bb.0:55; CHECK-NEXT: swpal56; CHECK-NOT: wzr57; CHECK-NEXT: dmb ishld58; CHECK-NEXT: ldr w0, [x1]59; CHECK-NEXT: ret60 %r0 = atomicrmw xchg ptr %ptr, i32 %value acq_rel61 fence acquire62 %r1 = load atomic i32, ptr %ptr2 monotonic, align 463 ret i32 %r164}65