106 lines · plain
1; RUN: llc < %s -mtriple=ve -mattr=+vpu | FileCheck %s2 3; Test for correct placement of 'lvl' instructions4 5; Function Attrs: nounwind readonly6declare <256 x double> @llvm.ve.vl.vld.vssl(i64, ptr, i32)7declare void @llvm.ve.vl.vst.vssl(<256 x double>, i64, ptr, i32)8 9; Check that the backend can handle constant VL as well as parametric VL10; sources.11 12; Function Attrs: nounwind13define void @switching_vl(i32 %evl, i32 %evl2, ptr %P, ptr %Q) {14; CHECK-LABEL: switching_vl:15; CHECK: # %bb.0:16; CHECK-NEXT: lea %s4, 25617; CHECK-NEXT: lvl %s418; CHECK-NEXT: vld %v0, 8, %s219; CHECK-NEXT: and %s0, %s0, (32)020; CHECK-NEXT: lvl %s021; CHECK-NEXT: vst %v0, 16, %s322; CHECK-NEXT: lea %s4, 12823; CHECK-NEXT: lvl %s424; CHECK-NEXT: vld %v0, 16, %s225; CHECK-NEXT: and %s1, %s1, (32)026; CHECK-NEXT: lvl %s127; CHECK-NEXT: vst %v0, 16, %s328; CHECK-NEXT: lvl %s429; CHECK-NEXT: vld %v0, 8, %s230; CHECK-NEXT: lvl %s031; CHECK-NEXT: vst %v0, 16, %s332; CHECK-NEXT: b.l.t (, %s10)33 %l0 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %P, i32 256)34 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l0, i64 16, ptr %Q, i32 %evl)35 %l1 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 16, ptr %P, i32 128)36 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l1, i64 16, ptr %Q, i32 %evl2)37 %l2 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %P, i32 128)38 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l2, i64 16, ptr %Q, i32 %evl)39 ret void40}41 42; Check that no redundant 'lvl' is inserted when vector length does not change43; in a basic block.44 45; Function Attrs: nounwind46define void @stable_vl(i32 %evl, ptr %P, ptr %Q) {47; CHECK-LABEL: stable_vl:48; CHECK: # %bb.0:49; CHECK-NEXT: and %s0, %s0, (32)050; CHECK-NEXT: lvl %s051; CHECK-NEXT: vld %v0, 8, %s152; CHECK-NEXT: vst %v0, 16, %s253; CHECK-NEXT: vld %v0, 16, %s154; CHECK-NEXT: vst %v0, 16, %s255; CHECK-NEXT: vld %v0, 8, %s156; CHECK-NEXT: vst %v0, 16, %s257; CHECK-NEXT: b.l.t (, %s10)58 %l0 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %P, i32 %evl)59 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l0, i64 16, ptr %Q, i32 %evl)60 %l1 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 16, ptr %P, i32 %evl)61 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l1, i64 16, ptr %Q, i32 %evl)62 %l2 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %P, i32 %evl)63 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l2, i64 16, ptr %Q, i32 %evl)64 ret void65}66 67;;; Check the case we have a call in the middle of vector instructions.68 69; Function Attrs: nounwind70define void @call_invl(i32 %evl, ptr %P, ptr %Q) {71; CHECK-LABEL: call_invl:72; CHECK: .LBB{{[0-9]+}}_2:73; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill74; CHECK-NEXT: st %s19, 296(, %s11) # 8-byte Folded Spill75; CHECK-NEXT: st %s20, 304(, %s11) # 8-byte Folded Spill76; CHECK-NEXT: or %s18, 0, %s177; CHECK-NEXT: and %s20, %s0, (32)078; CHECK-NEXT: lvl %s2079; CHECK-NEXT: vld %v0, 8, %s180; CHECK-NEXT: or %s19, 0, %s281; CHECK-NEXT: vst %v0, 16, %s282; CHECK-NEXT: lea %s0, fun@lo83; CHECK-NEXT: and %s0, %s0, (32)084; CHECK-NEXT: lea.sl %s12, fun@hi(, %s0)85; CHECK-NEXT: bsic %s10, (, %s12)86; CHECK-NEXT: lvl %s2087; CHECK-NEXT: vld %v0, 16, %s1888; CHECK-NEXT: vst %v0, 16, %s1989; CHECK-NEXT: vld %v0, 8, %s1890; CHECK-NEXT: vst %v0, 16, %s1991; CHECK-NEXT: ld %s20, 304(, %s11) # 8-byte Folded Reload92; CHECK-NEXT: ld %s19, 296(, %s11) # 8-byte Folded Reload93; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload94; CHECK-NEXT: or %s11, 0, %s995 %l0 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %P, i32 %evl)96 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l0, i64 16, ptr %Q, i32 %evl)97 call void @fun()98 %l1 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 16, ptr %P, i32 %evl)99 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l1, i64 16, ptr %Q, i32 %evl)100 %l2 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %P, i32 %evl)101 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l2, i64 16, ptr %Q, i32 %evl)102 ret void103}104 105declare void @fun()106