1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O2 -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s 3 4; #include <arm_sve.h> 5; #include <stdint.h> 6; 7; void redundant_store(uint32_t *p, svint32_t v) { 8; *p = 1; 9; *(svint32_t *)p = v; 10; } 11define void @redundant_store(ptr nocapture %p, <vscale x 4 x i32> %v) { 12; CHECK-LABEL: redundant_store: 13; CHECK: // %bb.0: 14; CHECK-NEXT: ptrue p0.s 15; CHECK-NEXT: st1w { z0.s }, p0, [x0] 16; CHECK-NEXT: ret 17 store i32 1, ptr %p, align 4 18 store <vscale x 4 x i32> %v, ptr %p, align 16 19 ret void 20} 21 22define void @two_scalable_same_size(ptr writeonly %ptr, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 23; CHECK-LABEL: two_scalable_same_size: 24; CHECK: // %bb.0: // %entry 25; CHECK-NEXT: ptrue p0.s 26; CHECK-NEXT: st1w { z1.s }, p0, [x0] 27; CHECK-NEXT: ret 28entry: 29 store <vscale x 4 x i32> %a, ptr %ptr 30 store <vscale x 4 x i32> %b, ptr %ptr 31 ret void 32} 33 34; make sure that scalable store is present, becuase we don't know its final size. 35define void @keep_scalable_store(ptr writeonly %ptr, ptr %a, <vscale x 4 x i32> %b) { 36; CHECK-LABEL: keep_scalable_store: 37; CHECK: // %bb.0: // %entry 38; CHECK-NEXT: ldp q2, q1, [x1] 39; CHECK-NEXT: ptrue p0.s 40; CHECK-NEXT: st1w { z0.s }, p0, [x0] 41; CHECK-NEXT: stp q2, q1, [x0] 42; CHECK-NEXT: ret 43entry: 44 %0 = load <8 x i32>, ptr %a 45 store <vscale x 4 x i32> %b, ptr %ptr 46 store <8 x i32> %0, ptr %ptr 47 ret void 48} 49 50define void @two_scalable_keep_stores(ptr writeonly %ptr, <vscale x 4 x i32> %a, <vscale x 4 x i64> %b) { 51; CHECK-LABEL: two_scalable_keep_stores: 52; CHECK: // %bb.0: // %entry 53; CHECK-NEXT: ptrue p0.d 54; CHECK-NEXT: ptrue p1.s 55; CHECK-NEXT: st1d { z2.d }, p0, [x0, #1, mul vl] 56; CHECK-NEXT: st1d { z1.d }, p0, [x0] 57; CHECK-NEXT: st1w { z0.s }, p1, [x0] 58; CHECK-NEXT: ret 59entry: 60 store <vscale x 4 x i64> %b, ptr %ptr 61 store <vscale x 4 x i32> %a, ptr %ptr 62 ret void 63} 64 65define void @two_scalable_remove_store(ptr writeonly %ptr, <vscale x 4 x i32> %a, <vscale x 4 x i64> %b) { 66; CHECK-LABEL: two_scalable_remove_store: 67; CHECK: // %bb.0: // %entry 68; CHECK-NEXT: ptrue p0.d 69; CHECK-NEXT: st1d { z2.d }, p0, [x0, #1, mul vl] 70; CHECK-NEXT: st1d { z1.d }, p0, [x0] 71; CHECK-NEXT: ret 72entry: 73 store <vscale x 4 x i32> %a, ptr %ptr 74 store <vscale x 4 x i64> %b, ptr %ptr 75 ret void 76} 77