brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · 6d56b72 Raw
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