80 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -p loop-vectorize -force-vector-width=4 -S %s | FileCheck %s3 4target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128-Fn32"5target triple = "arm64-apple-macosx14.0.0"6 7; Test for https://github.com/llvm/llvm-project/issues/109510.8define i32 @test_invariant_replicate_region(i32 %x, i1 %c) {9; CHECK-LABEL: define i32 @test_invariant_replicate_region(10; CHECK-SAME: i32 [[X:%.*]], i1 [[C:%.*]]) {11; CHECK-NEXT: [[ENTRY:.*:]]12; CHECK-NEXT: br label %[[VECTOR_PH:.*]]13; CHECK: [[VECTOR_PH]]:14; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]15; CHECK: [[VECTOR_BODY]]:16; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_UREM_CONTINUE6:.*]] ]17; CHECK-NEXT: br i1 [[C]], label %[[PRED_UREM_IF:.*]], label %[[PRED_UREM_CONTINUE:.*]]18; CHECK: [[PRED_UREM_IF]]:19; CHECK-NEXT: [[TMP1:%.*]] = urem i32 10, [[X]]20; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 021; CHECK-NEXT: br label %[[PRED_UREM_CONTINUE]]22; CHECK: [[PRED_UREM_CONTINUE]]:23; CHECK-NEXT: [[TMP3:%.*]] = phi <4 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP2]], %[[PRED_UREM_IF]] ]24; CHECK-NEXT: br i1 [[C]], label %[[PRED_UREM_IF1:.*]], label %[[PRED_UREM_CONTINUE2:.*]]25; CHECK: [[PRED_UREM_IF1]]:26; CHECK-NEXT: [[TMP5:%.*]] = urem i32 10, [[X]]27; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x i32> [[TMP3]], i32 [[TMP5]], i32 128; CHECK-NEXT: br label %[[PRED_UREM_CONTINUE2]]29; CHECK: [[PRED_UREM_CONTINUE2]]:30; CHECK-NEXT: [[TMP7:%.*]] = phi <4 x i32> [ [[TMP3]], %[[PRED_UREM_CONTINUE]] ], [ [[TMP6]], %[[PRED_UREM_IF1]] ]31; CHECK-NEXT: br i1 [[C]], label %[[PRED_UREM_IF3:.*]], label %[[PRED_UREM_CONTINUE4:.*]]32; CHECK: [[PRED_UREM_IF3]]:33; CHECK-NEXT: [[TMP9:%.*]] = urem i32 10, [[X]]34; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP7]], i32 [[TMP9]], i32 235; CHECK-NEXT: br label %[[PRED_UREM_CONTINUE4]]36; CHECK: [[PRED_UREM_CONTINUE4]]:37; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP7]], %[[PRED_UREM_CONTINUE2]] ], [ [[TMP10]], %[[PRED_UREM_IF3]] ]38; CHECK-NEXT: br i1 [[C]], label %[[PRED_UREM_IF5:.*]], label %[[PRED_UREM_CONTINUE6]]39; CHECK: [[PRED_UREM_IF5]]:40; CHECK-NEXT: [[TMP13:%.*]] = urem i32 10, [[X]]41; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP13]], i32 342; CHECK-NEXT: br label %[[PRED_UREM_CONTINUE6]]43; CHECK: [[PRED_UREM_CONTINUE6]]:44; CHECK-NEXT: [[TMP12:%.*]] = phi <4 x i32> [ [[TMP11]], %[[PRED_UREM_CONTINUE4]] ], [ [[TMP14]], %[[PRED_UREM_IF5]] ]45; CHECK-NEXT: [[PREDPHI:%.*]] = select i1 [[C]], <4 x i32> [[TMP12]], <4 x i32> zeroinitializer46; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 447; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i32 [[INDEX_NEXT]], 10048; CHECK-NEXT: br i1 [[TMP16]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]49; CHECK: [[MIDDLE_BLOCK]]:50; CHECK-NEXT: [[TMP17:%.*]] = extractelement <4 x i32> [[PREDPHI]], i32 351; CHECK-NEXT: br label %[[EXIT:.*]]52; CHECK: [[EXIT]]:53; CHECK-NEXT: ret i32 [[TMP17]]54;55entry:56 br label %loop.header57 58loop.header:59 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]60 br i1 %c, label %then, label %loop.latch61 62then:63 %rem.1 = urem i32 10, %x64 br label %loop.latch65 66loop.latch:67 %res = phi i32 [ 0, %loop.header ], [ %rem.1, %then ]68 %iv.next = add i32 %iv, 169 %ec = icmp eq i32 %iv, 9970 br i1 %ec, label %exit, label %loop.header71 72exit:73 ret i32 %res74}75;.76; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}77; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}78; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}79;.80