201 lines · plain
1; RUN: opt -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp < %s -codegenprepare -S | FileCheck -check-prefix=CHECK %s2 3define void @sink_add_mul(ptr %s1, i32 %x, ptr %d, i32 %n) {4; CHECK-LABEL: @sink_add_mul(5; CHECK: vector.ph:6; CHECK-NOT: %{{.*}} = insertelement <4 x i32> undef, i32 %{{.*}}, i32 07; CHECK-NOT: %{{.*}} = shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> zeroinitializer8; CHECK: vector.body:9; CHECK: [[TMP2:%.*]] = insertelement <4 x i32> undef, i32 [[X:%.*]], i32 010; CHECK: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> undef, <4 x i32> zeroinitializer11;12entry:13 %cmp6 = icmp sgt i32 %n, 014 br i1 %cmp6, label %vector.ph, label %for.cond.cleanup15 16vector.ph: ; preds = %for.body.preheader17 %n.vec = and i32 %n, -418 %broadcast.splatinsert8 = insertelement <4 x i32> undef, i32 %x, i32 019 %broadcast.splat9 = shufflevector <4 x i32> %broadcast.splatinsert8, <4 x i32> undef, <4 x i32> zeroinitializer20 br label %vector.body21 22vector.body: ; preds = %vector.body, %vector.ph23 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]24 %0 = getelementptr inbounds i32, ptr %s1, i32 %index25 %wide.load = load <4 x i32>, ptr %0, align 426 %1 = mul nsw <4 x i32> %wide.load, %broadcast.splat927 %2 = getelementptr inbounds i32, ptr %d, i32 %index28 %wide.load10 = load <4 x i32>, ptr %2, align 429 %3 = add nsw <4 x i32> %wide.load10, %130 store <4 x i32> %3, ptr %2, align 431 %index.next = add i32 %index, 432 %4 = icmp eq i32 %index.next, %n.vec33 br i1 %4, label %for.cond.cleanup, label %vector.body34 35for.cond.cleanup: ; preds = %for.body, %middle.block, %entry36 ret void37}38 39define void @sink_add_mul_multiple(ptr %s1, ptr %s2, i32 %x, ptr %d, ptr %d2, i32 %n) {40; CHECK-LABEL: @sink_add_mul_multiple(41; CHECK: vector.ph:42; CHECK-NOT: %{{.*}} = insertelement <4 x i32> undef, i32 %{{.*}}, i32 043; CHECK-NOT: %{{.*}} = shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> zeroinitializer44; CHECK: vector.body:45; CHECK: [[TMP2:%.*]] = insertelement <4 x i32> undef, i32 %x, i32 046; CHECK: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> undef, <4 x i32> zeroinitializer47; CHECK: mul nsw <4 x i32> %wide.load, [[TMP3]]48; CHECK: [[TMP2b:%.*]] = insertelement <4 x i32> undef, i32 %x, i32 049; CHECK: [[TMP3b:%.*]] = shufflevector <4 x i32> [[TMP2b]], <4 x i32> undef, <4 x i32> zeroinitializer50; CHECK: mul nsw <4 x i32> %wide.load18, [[TMP3b]]51;52entry:53 %cmp13 = icmp sgt i32 %n, 054 br i1 %cmp13, label %vector.ph, label %for.cond.cleanup55 56vector.ph: ; preds = %for.body.preheader57 %n.vec = and i32 %n, -458 %broadcast.splatinsert15 = insertelement <4 x i32> undef, i32 %x, i32 059 %broadcast.splat16 = shufflevector <4 x i32> %broadcast.splatinsert15, <4 x i32> undef, <4 x i32> zeroinitializer60 br label %vector.body61 62vector.body: ; preds = %vector.body, %vector.ph63 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]64 %0 = getelementptr inbounds i32, ptr %s1, i32 %index65 %wide.load = load <4 x i32>, ptr %0, align 466 %1 = mul nsw <4 x i32> %wide.load, %broadcast.splat1667 %2 = getelementptr inbounds i32, ptr %d, i32 %index68 %wide.load17 = load <4 x i32>, ptr %2, align 469 %3 = add nsw <4 x i32> %wide.load17, %170 store <4 x i32> %3, ptr %2, align 471 %4 = getelementptr inbounds i32, ptr %s2, i32 %index72 %wide.load18 = load <4 x i32>, ptr %4, align 473 %5 = mul nsw <4 x i32> %wide.load18, %broadcast.splat1674 %6 = getelementptr inbounds i32, ptr %d2, i32 %index75 %wide.load19 = load <4 x i32>, ptr %6, align 476 %7 = add nsw <4 x i32> %wide.load19, %577 store <4 x i32> %7, ptr %6, align 478 %index.next = add i32 %index, 479 %8 = icmp eq i32 %index.next, %n.vec80 br i1 %8, label %for.cond.cleanup, label %vector.body81 82for.cond.cleanup: ; preds = %for.body, %middle.block, %entry83 ret void84}85 86 87define void @sink_add_sub_unsinkable(ptr %s1, ptr %s2, i32 %x, ptr %d, ptr %d2, i32 %n) {88; CHECK-LABEL: @sink_add_sub_unsinkable(89; CHECK-NEXT: entry:90; CHECK-NEXT: [[CMP13:%.*]] = icmp sgt i32 [[N:%.*]], 091; CHECK-NEXT: br i1 [[CMP13]], label [[VECTOR_PH:%.*]], label [[FOR_COND_CLEANUP:%.*]]92; CHECK: vector.ph:93; CHECK-NEXT: [[N_VEC:%.*]] = and i32 [[N]], -494; CHECK-NEXT: [[BROADCAST_SPLATINSERT15:%.*]] = insertelement <4 x i32> undef, i32 [[X:%.*]], i32 095; CHECK-NEXT: [[BROADCAST_SPLAT16:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT15]], <4 x i32> undef, <4 x i32> zeroinitializer96; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]97;98entry:99 %cmp13 = icmp sgt i32 %n, 0100 br i1 %cmp13, label %vector.ph, label %for.cond.cleanup101 102vector.ph: ; preds = %for.body.preheader103 %n.vec = and i32 %n, -4104 %broadcast.splatinsert15 = insertelement <4 x i32> undef, i32 %x, i32 0105 %broadcast.splat16 = shufflevector <4 x i32> %broadcast.splatinsert15, <4 x i32> undef, <4 x i32> zeroinitializer106 br label %vector.body107 108vector.body: ; preds = %vector.body, %vector.ph109 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]110 %0 = getelementptr inbounds i32, ptr %s1, i32 %index111 %wide.load = load <4 x i32>, ptr %0, align 4112 %1 = mul nsw <4 x i32> %wide.load, %broadcast.splat16113 %2 = getelementptr inbounds i32, ptr %d, i32 %index114 %wide.load17 = load <4 x i32>, ptr %2, align 4115 %3 = add nsw <4 x i32> %wide.load17, %1116 store <4 x i32> %3, ptr %2, align 4117 %4 = getelementptr inbounds i32, ptr %s2, i32 %index118 %wide.load18 = load <4 x i32>, ptr %4, align 4119 %5 = sub nsw <4 x i32> %broadcast.splat16, %wide.load18120 %6 = getelementptr inbounds i32, ptr %d2, i32 %index121 %wide.load19 = load <4 x i32>, ptr %6, align 4122 %7 = add nsw <4 x i32> %wide.load19, %5123 store <4 x i32> %7, ptr %6, align 4124 %index.next = add i32 %index, 4125 %8 = icmp eq i32 %index.next, %n.vec126 br i1 %8, label %for.cond.cleanup, label %vector.body127 128for.cond.cleanup: ; preds = %for.body, %middle.block, %entry129 ret void130}131 132define void @sink_sub(ptr %s1, i32 %x, ptr %d, i32 %n) {133; CHECK-LABEL: @sink_sub(134; CHECK: vector.ph:135; CHECK-NOT: %{{.*}} = insertelement <4 x i32> undef, i32 %{{.*}}, i32 0136; CHECK-NOT: %{{.*}} = shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> zeroinitializer137; CHECK: vector.body:138; CHECK: [[TMP2:%.*]] = insertelement <4 x i32> undef, i32 [[X:%.*]], i32 0139; CHECK: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> undef, <4 x i32> zeroinitializer140;141entry:142 %cmp6 = icmp sgt i32 %n, 0143 br i1 %cmp6, label %vector.ph, label %for.cond.cleanup144 145vector.ph: ; preds = %for.body.preheader146 %n.vec = and i32 %n, -4147 %broadcast.splatinsert8 = insertelement <4 x i32> undef, i32 %x, i32 0148 %broadcast.splat9 = shufflevector <4 x i32> %broadcast.splatinsert8, <4 x i32> undef, <4 x i32> zeroinitializer149 br label %vector.body150 151vector.body: ; preds = %vector.body, %vector.ph152 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]153 %0 = getelementptr inbounds i32, ptr %s1, i32 %index154 %wide.load = load <4 x i32>, ptr %0, align 4155 %1 = sub nsw <4 x i32> %wide.load, %broadcast.splat9156 %2 = getelementptr inbounds i32, ptr %d, i32 %index157 store <4 x i32> %1, ptr %2, align 4158 %index.next = add i32 %index, 4159 %3 = icmp eq i32 %index.next, %n.vec160 br i1 %3, label %for.cond.cleanup, label %vector.body161 162for.cond.cleanup: ; preds = %for.body, %middle.block, %entry163 ret void164}165 166define void @sink_sub_unsinkable(ptr %s1, i32 %x, ptr %d, i32 %n) {167entry:168; CHECK-LABEL: @sink_sub_unsinkable(169; CHECK: vector.ph:170; CHECK-NEXT: [[N_VEC:%.*]] = and i32 [[N]], -4171; CHECK-NEXT: [[BROADCAST_SPLATINSERT15:%.*]] = insertelement <4 x i32> undef, i32 [[X:%.*]], i32 0172; CHECK-NEXT: [[BROADCAST_SPLAT16:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT15]], <4 x i32> undef, <4 x i32> zeroinitializer173; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]174; CHECK: vector.body:175; CHECK-NOT: %{{.*}} = insertelement <4 x i32> undef, i32 %{{.*}}, i32 0176; CHECK-NOT: %{{.*}} = shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> zeroinitializer177;178 %cmp6 = icmp sgt i32 %n, 0179 br i1 %cmp6, label %vector.ph, label %for.cond.cleanup180 181vector.ph: ; preds = %for.body.preheader182 %n.vec = and i32 %n, -4183 %broadcast.splatinsert8 = insertelement <4 x i32> undef, i32 %x, i32 0184 %broadcast.splat9 = shufflevector <4 x i32> %broadcast.splatinsert8, <4 x i32> undef, <4 x i32> zeroinitializer185 br label %vector.body186 187vector.body: ; preds = %vector.body, %vector.ph188 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]189 %0 = getelementptr inbounds i32, ptr %s1, i32 %index190 %wide.load = load <4 x i32>, ptr %0, align 4191 %1 = sub nsw <4 x i32> %broadcast.splat9, %wide.load192 %2 = getelementptr inbounds i32, ptr %d, i32 %index193 store <4 x i32> %1, ptr %2, align 4194 %index.next = add i32 %index, 4195 %3 = icmp eq i32 %index.next, %n.vec196 br i1 %3, label %for.cond.cleanup, label %vector.body197 198for.cond.cleanup: ; preds = %for.body, %middle.block, %entry199 ret void200}201