brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.3 KiB · acc58ed Raw
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