79 lines · plain
1; RUN: opt -passes=licm -mtriple aarch64-linux-gnu -mattr=+sve -S < %s | FileCheck %s2 3define void @no_hoist_load1_nxv2i64(ptr %out, ptr %in8, i32 %n) {4; CHECK-LABEL: @no_hoist_load1_nxv2i64(5; CHECK: entry:6; CHECK-NOT: load7; CHECK: for.body:8; CHECK: load9entry:10 %cmp0 = icmp ugt i32 %n, 011 %invst = call ptr @llvm.invariant.start.p0(i64 16, ptr %in8)12 br i1 %cmp0, label %for.body, label %for.end13 14for.body:15 %i = phi i32 [0, %entry], [%inc, %for.body]16 %i2 = zext i32 %i to i6417 %ptr = getelementptr <vscale x 2 x i64>, ptr %out, i64 %i218 %val = load <vscale x 2 x i64>, ptr %in8, align 1619 store <vscale x 2 x i64> %val, ptr %ptr, align 1620 %inc = add nuw nsw i32 %i, 121 %cmp = icmp ult i32 %inc, %n22 br i1 %cmp, label %for.body, label %for.end23 24for.end:25 ret void26}27 28define void @no_hoist_gather(ptr %out_ptr, ptr %in_ptr, <vscale x 2 x i64> %ptr_vec, i64 %n, <vscale x 2 x i1> %pred) {29; CHECK-LABEL: @no_hoist_gather(30; CHECK: entry:31; CHECK-NOT: llvm.aarch64.sve.ld1.gather.scalar.offset32; CHECK: for.body:33; CHECK: llvm.aarch64.sve.ld1.gather.scalar.offset34entry:35 br label %for.body36 37for.body:38 %i = phi i64 [0, %entry], [%inc, %for.body]39 %gather = call <vscale x 2 x i32> @llvm.aarch64.sve.ld1.gather.scalar.offset.nxv2i32.nxv2i64(<vscale x 2 x i1> %pred, <vscale x 2 x i64> %ptr_vec, i64 0)40 %in_ptr_gep = getelementptr <vscale x 2 x i32>, ptr %in_ptr, i64 %i41 %in_ptr_load = load <vscale x 2 x i32>, ptr %in_ptr_gep, align 842 %sum = add <vscale x 2 x i32> %gather, %in_ptr_load43 %out_ptr_gep = getelementptr <vscale x 2 x i32>, ptr %out_ptr, i64 %i44 store <vscale x 2 x i32> %sum, ptr %out_ptr_gep, align 845 %inc = add nuw nsw i64 %i, 146 %cmp = icmp ult i64 %inc, %n47 br i1 %cmp, label %for.body, label %for.end48 49for.end:50 ret void51}52 53define void @no_hoist_scatter(ptr %out_ptr, ptr %in_ptr, <vscale x 2 x i64> %ptr_vec, i64 %n, <vscale x 2 x i1> %pred) {54; CHECK-LABEL: @no_hoist_scatter(55; CHECK: entry:56; CHECK-NOT: load57; CHECK: for.body:58; CHECK: load59entry:60 br label %for.body61 62for.body:63 %i = phi i64 [0, %entry], [%inc, %for.body]64 %in_ptr_load = load <vscale x 2 x i32>, ptr %in_ptr, align 865 call void @llvm.aarch64.sve.st1.scatter.scalar.offset.nxv2i32.nxv2i64(<vscale x 2 x i32> %in_ptr_load, <vscale x 2 x i1> %pred, <vscale x 2 x i64> %ptr_vec, i64 %i)66 %inc = add nuw nsw i64 %i, 167 %cmp = icmp ult i64 %inc, %n68 br i1 %cmp, label %for.body, label %for.end69 70for.end:71 ret void72}73 74declare ptr @llvm.invariant.start.p0(i64, ptr nocapture) nounwind readonly75 76declare void @llvm.aarch64.sve.st1.scatter.scalar.offset.nxv2i32.nxv2i64(<vscale x 2 x i32>, <vscale x 2 x i1>, <vscale x 2 x i64>, i64)77 78declare <vscale x 2 x i32> @llvm.aarch64.sve.ld1.gather.scalar.offset.nxv2i32.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, i64)79