178 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s3 4; Tests for PR54266.5define i32 @one_direct_branch(ptr %src) {6; CHECK-LABEL: @one_direct_branch(7; CHECK-NEXT: entry:8; CHECK-NEXT: br label [[VECTOR_PH:%.*]]9; CHECK: vector.ph:10; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]11; CHECK: vector.body:12; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]13; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[SRC:%.*]], i32 [[INDEX]]14; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 415; CHECK-NEXT: [[TMP3:%.*]] = xor <4 x i32> splat (i32 25500), [[WIDE_LOAD]]16; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 417; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 100018; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]19; CHECK: middle.block:20; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i32> [[TMP3]], i32 321; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]22; CHECK: exit:23; CHECK-NEXT: ret i32 [[TMP5]]24;25entry:26 br label %loop27 28loop:29 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]30 %src.gep = getelementptr inbounds i32, ptr %src, i32 %iv31 %lv = load i32, ptr %src.gep32 %xor = xor i32 25500, %lv33 br label %loop.latch34 35loop.latch:36 %phi.xor = phi i32 [ %xor, %loop ]37 %iv.next = add nsw i32 %iv, 138 %tobool.not = icmp eq i32 %iv.next, 100039 br i1 %tobool.not, label %exit, label %loop40 41exit:42 %xor.lcssa = phi i32 [ %phi.xor, %loop.latch ]43 ret i32 %xor.lcssa44}45 46define i32 @two_direct_branch(ptr %src) {47; CHECK-LABEL: @two_direct_branch(48; CHECK-NEXT: entry:49; CHECK-NEXT: br label [[VECTOR_PH:%.*]]50; CHECK: vector.ph:51; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]52; CHECK: vector.body:53; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]54; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[SRC:%.*]], i32 [[INDEX]]55; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 456; CHECK-NEXT: [[TMP3:%.*]] = xor <4 x i32> splat (i32 25500), [[WIDE_LOAD]]57; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 458; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 100059; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]60; CHECK: middle.block:61; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i32> [[TMP3]], i32 362; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]63; CHECK: exit:64; CHECK-NEXT: ret i32 [[TMP5]]65;66entry:67 br label %loop68 69loop: ; preds = %for.inc3, %entry70 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]71 %src.gep = getelementptr inbounds i32, ptr %src, i32 %iv72 %lv = load i32, ptr %src.gep73 %xor = xor i32 25500, %lv74 br label %bb75 76bb:77 %phi.xor.1 = phi i32 [ %xor, %loop ]78 br label %loop.latch79 80loop.latch:81 %phi.xor = phi i32 [ %phi.xor.1, %bb ]82 %iv.next = add nsw i32 %iv, 183 %tobool.not = icmp eq i32 %iv.next, 100084 br i1 %tobool.not, label %exit, label %loop85 86exit:87 %xor.lcssa = phi i32 [ %phi.xor, %loop.latch ]88 ret i32 %xor.lcssa89}90 91define i32 @cond_branch(i32 %a, ptr %src) {92; CHECK-LABEL: @cond_branch(93; CHECK-NEXT: entry:94; CHECK-NEXT: br label [[VECTOR_PH:%.*]]95; CHECK: vector.ph:96; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[A:%.*]], i64 097; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer98; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]99; CHECK: vector.body:100; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]101; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]102; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[SRC:%.*]], i32 [[INDEX]]103; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4104; CHECK-NEXT: [[TMP3:%.*]] = xor <4 x i32> splat (i32 25500), [[WIDE_LOAD]]105; CHECK-NEXT: [[TMP4:%.*]] = icmp ne <4 x i32> [[VEC_IND]], [[BROADCAST_SPLAT]]106; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP4]], <4 x i32> [[TMP3]], <4 x i32> splat (i32 10)107; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4108; CHECK-NEXT: [[VEC_IND_NEXT]] = add nsw <4 x i32> [[VEC_IND]], splat (i32 4)109; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000110; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]111; CHECK: middle.block:112; CHECK-NEXT: [[TMP7:%.*]] = extractelement <4 x i32> [[PREDPHI]], i32 3113; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]114; CHECK: exit:115; CHECK-NEXT: ret i32 [[TMP7]]116;117entry:118 br label %loop119 120loop:121 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]122 %src.gep = getelementptr inbounds i32, ptr %src, i32 %iv123 %lv = load i32, ptr %src.gep124 %xor = xor i32 25500, %lv125 %cmp = icmp ne i32 %iv, %a126 br i1 %cmp, label %loop.latch, label %then127 128then:129 br label %loop.latch130 131loop.latch:132 %phi.xor = phi i32 [ %xor, %loop ], [ 10, %then ]133 %iv.next = add nsw i32 %iv, 1134 %tobool.not = icmp eq i32 %iv.next, 1000135 br i1 %tobool.not, label %exit, label %loop136 137exit:138 %xor.lcssa = phi i32 [ %phi.xor, %loop.latch ]139 ret i32 %xor.lcssa140}141 142; Test case for PR54370.143; TODO: Should either compute the final value of the truncated IV independent144; of loop or scalarize the vector IV.145define i32 @optimizable_trunc_used_outside() {146; CHECK-LABEL: @optimizable_trunc_used_outside(147; CHECK-NEXT: entry:148; CHECK-NEXT: br label [[VECTOR_PH:%.*]]149; CHECK: vector.ph:150; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]151; CHECK: vector.body:152; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]153; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]154; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4155; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)156; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000157; CHECK-NEXT: br i1 [[TMP0]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]158; CHECK: middle.block:159; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i32> [[VEC_IND]], i32 3160; CHECK-NEXT: br label [[LOOP:%.*]]161; CHECK: exit:162; CHECK-NEXT: ret i32 [[TMP1]]163;164entry:165 br label %loop166 167loop:168 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]169 %iv.trunc = trunc i64 %iv to i32170 %iv.next = add nuw nsw i64 %iv, 1171 %exitcond.not.i.i = icmp eq i64 %iv.next, 1000172 br i1 %exitcond.not.i.i, label %exit, label %loop173 174exit:175 %iv.trunc.lcssa = phi i32 [ %iv.trunc, %loop ]176 ret i32 %iv.trunc.lcssa177}178