134777c23SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 234777c23SFlorian Hahn; RUN: opt -p loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s 334777c23SFlorian Hahn 434777c23SFlorian Hahntarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2" 534777c23SFlorian Hahn 634777c23SFlorian Hahn; Test with blend recipe in header VPBB, from 734777c23SFlorian Hahn; https://github.com/llvm/llvm-project/issues/88297. 834777c23SFlorian Hahndefine i64 @pr88297() { 934777c23SFlorian Hahn; CHECK-LABEL: define i64 @pr88297() { 1034777c23SFlorian Hahn; CHECK-NEXT: entry: 1134777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 1234777c23SFlorian Hahn; CHECK: vector.ph: 1334777c23SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 1434777c23SFlorian Hahn; CHECK: vector.body: 1534777c23SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 1634777c23SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 1734777c23SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000 1834777c23SFlorian Hahn; CHECK-NEXT: br i1 [[TMP0]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 1934777c23SFlorian Hahn; CHECK: middle.block: 2034777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[SCALAR_PH]] 2134777c23SFlorian Hahn; CHECK: scalar.ph: 2234777c23SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 1000, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 2334777c23SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 2434777c23SFlorian Hahn; CHECK: loop.header: 2534777c23SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 2634777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[LOOP_LATCH]], label [[THEN:%.*]] 2734777c23SFlorian Hahn; CHECK: then: 2834777c23SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 2934777c23SFlorian Hahn; CHECK: loop.latch: 3034777c23SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = phi i64 [ 1, [[THEN]] ], [ 0, [[LOOP_HEADER]] ] 3134777c23SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 3234777c23SFlorian Hahn; CHECK-NEXT: [[ICMP:%.*]] = icmp sgt i32 [[IV]], 1000 3334777c23SFlorian Hahn; CHECK-NEXT: br i1 [[ICMP]], label [[EXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP3:![0-9]+]] 3434777c23SFlorian Hahn; CHECK: exit: 3534777c23SFlorian Hahn; CHECK-NEXT: [[R_LCSSA:%.*]] = phi i64 [ [[R]], [[LOOP_LATCH]] ], [ 1, [[MIDDLE_BLOCK]] ] 3634777c23SFlorian Hahn; CHECK-NEXT: ret i64 [[R_LCSSA]] 3734777c23SFlorian Hahn; 3834777c23SFlorian Hahnentry: 3934777c23SFlorian Hahn br label %loop.header 4034777c23SFlorian Hahn 4134777c23SFlorian Hahnloop.header: 4234777c23SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 4334777c23SFlorian Hahn br i1 false, label %loop.latch, label %then 4434777c23SFlorian Hahn 4534777c23SFlorian Hahnthen: 4634777c23SFlorian Hahn br label %loop.latch 4734777c23SFlorian Hahn 4834777c23SFlorian Hahnloop.latch: 4934777c23SFlorian Hahn %r = phi i64 [ 1, %then ], [ 0, %loop.header ] 5034777c23SFlorian Hahn %iv.next = add i32 %iv, 1 5134777c23SFlorian Hahn %icmp = icmp sgt i32 %iv, 1000 5234777c23SFlorian Hahn br i1 %icmp, label %exit, label %loop.header 5334777c23SFlorian Hahn 5434777c23SFlorian Hahnexit: 5534777c23SFlorian Hahn %r.lcssa = phi i64 [ %r, %loop.latch ] 5634777c23SFlorian Hahn ret i64 %r.lcssa 5734777c23SFlorian Hahn} 5834777c23SFlorian Hahn 5934777c23SFlorian Hahndefine i64 @pr88297_incoming_ops_reordered() { 6034777c23SFlorian Hahn; CHECK-LABEL: define i64 @pr88297_incoming_ops_reordered() { 6134777c23SFlorian Hahn; CHECK-NEXT: entry: 6234777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 6334777c23SFlorian Hahn; CHECK: vector.ph: 6434777c23SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 6534777c23SFlorian Hahn; CHECK: vector.body: 6634777c23SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 6734777c23SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 6834777c23SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000 6934777c23SFlorian Hahn; CHECK-NEXT: br i1 [[TMP0]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] 7034777c23SFlorian Hahn; CHECK: middle.block: 7134777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[SCALAR_PH]] 7234777c23SFlorian Hahn; CHECK: scalar.ph: 7334777c23SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 1000, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 7434777c23SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 7534777c23SFlorian Hahn; CHECK: loop.header: 7634777c23SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 7734777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[LOOP_LATCH]], label [[THEN:%.*]] 7834777c23SFlorian Hahn; CHECK: then: 7934777c23SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 8034777c23SFlorian Hahn; CHECK: loop.latch: 8134777c23SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = phi i64 [ 0, [[LOOP_HEADER]] ], [ 1, [[THEN]] ] 8234777c23SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 8334777c23SFlorian Hahn; CHECK-NEXT: [[ICMP:%.*]] = icmp sgt i32 [[IV]], 1000 8434777c23SFlorian Hahn; CHECK-NEXT: br i1 [[ICMP]], label [[EXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]] 8534777c23SFlorian Hahn; CHECK: exit: 8634777c23SFlorian Hahn; CHECK-NEXT: [[R_LCSSA:%.*]] = phi i64 [ [[R]], [[LOOP_LATCH]] ], [ 1, [[MIDDLE_BLOCK]] ] 8734777c23SFlorian Hahn; CHECK-NEXT: ret i64 [[R_LCSSA]] 8834777c23SFlorian Hahn; 8934777c23SFlorian Hahnentry: 9034777c23SFlorian Hahn br label %loop.header 9134777c23SFlorian Hahn 9234777c23SFlorian Hahnloop.header: 9334777c23SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 9434777c23SFlorian Hahn br i1 false, label %loop.latch, label %then 9534777c23SFlorian Hahn 9634777c23SFlorian Hahnthen: 9734777c23SFlorian Hahn br label %loop.latch 9834777c23SFlorian Hahn 9934777c23SFlorian Hahnloop.latch: 10034777c23SFlorian Hahn %r = phi i64 [ 0, %loop.header ], [ 1, %then ] 10134777c23SFlorian Hahn %iv.next = add i32 %iv, 1 10234777c23SFlorian Hahn %icmp = icmp sgt i32 %iv, 1000 10334777c23SFlorian Hahn br i1 %icmp, label %exit, label %loop.header 10434777c23SFlorian Hahn 10534777c23SFlorian Hahnexit: 10634777c23SFlorian Hahn %r.lcssa = phi i64 [ %r, %loop.latch ] 10734777c23SFlorian Hahn ret i64 %r.lcssa 10834777c23SFlorian Hahn} 10934777c23SFlorian Hahn 11034777c23SFlorian Hahndefine i64 @invar_cond(i1 %c) { 11134777c23SFlorian Hahn; CHECK-LABEL: define i64 @invar_cond( 11234777c23SFlorian Hahn; CHECK-SAME: i1 [[C:%.*]]) { 11334777c23SFlorian Hahn; CHECK-NEXT: entry: 11434777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 11534777c23SFlorian Hahn; CHECK: vector.ph: 11634777c23SFlorian Hahn; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i1> poison, i1 [[C]], i64 0 11734777c23SFlorian Hahn; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i1> [[BROADCAST_SPLATINSERT]], <4 x i1> poison, <4 x i32> zeroinitializer 11838fffa63SPaul Walker; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[BROADCAST_SPLAT]], <4 x i64> zeroinitializer, <4 x i64> splat (i64 1) 11934777c23SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 12034777c23SFlorian Hahn; CHECK: vector.body: 12134777c23SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 12234777c23SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 12334777c23SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000 12434777c23SFlorian Hahn; CHECK-NEXT: br i1 [[TMP0]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]] 12534777c23SFlorian Hahn; CHECK: middle.block: 12634777c23SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i64> [[PREDPHI]], i32 3 12734777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[SCALAR_PH]] 12834777c23SFlorian Hahn; CHECK: scalar.ph: 12934777c23SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 1000, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 13034777c23SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 13134777c23SFlorian Hahn; CHECK: loop.header: 13234777c23SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 13334777c23SFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[LOOP_LATCH]], label [[THEN:%.*]] 13434777c23SFlorian Hahn; CHECK: then: 13534777c23SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 13634777c23SFlorian Hahn; CHECK: loop.latch: 13734777c23SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = phi i64 [ 1, [[THEN]] ], [ 0, [[LOOP_HEADER]] ] 13834777c23SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 13934777c23SFlorian Hahn; CHECK-NEXT: [[ICMP:%.*]] = icmp sgt i32 [[IV]], 1000 14034777c23SFlorian Hahn; CHECK-NEXT: br i1 [[ICMP]], label [[EXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP7:![0-9]+]] 14134777c23SFlorian Hahn; CHECK: exit: 14234777c23SFlorian Hahn; CHECK-NEXT: [[R_LCSSA:%.*]] = phi i64 [ [[R]], [[LOOP_LATCH]] ], [ [[TMP1]], [[MIDDLE_BLOCK]] ] 14334777c23SFlorian Hahn; CHECK-NEXT: ret i64 [[R_LCSSA]] 14434777c23SFlorian Hahn; 14534777c23SFlorian Hahnentry: 14634777c23SFlorian Hahn br label %loop.header 14734777c23SFlorian Hahn 14834777c23SFlorian Hahnloop.header: 14934777c23SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 15034777c23SFlorian Hahn br i1 %c, label %loop.latch, label %then 15134777c23SFlorian Hahn 15234777c23SFlorian Hahnthen: 15334777c23SFlorian Hahn br label %loop.latch 15434777c23SFlorian Hahn 15534777c23SFlorian Hahnloop.latch: 15634777c23SFlorian Hahn %r = phi i64 [ 1, %then ], [ 0, %loop.header ] 15734777c23SFlorian Hahn %iv.next = add i32 %iv, 1 15834777c23SFlorian Hahn %icmp = icmp sgt i32 %iv, 1000 15934777c23SFlorian Hahn br i1 %icmp, label %exit, label %loop.header 16034777c23SFlorian Hahn 16134777c23SFlorian Hahnexit: 16234777c23SFlorian Hahn %r.lcssa = phi i64 [ %r, %loop.latch ] 16334777c23SFlorian Hahn ret i64 %r.lcssa 16434777c23SFlorian Hahn} 16534777c23SFlorian Hahn 16634777c23SFlorian Hahndefine i64 @invar_cond_incoming_ops_reordered(i1 %c) { 16734777c23SFlorian Hahn; CHECK-LABEL: define i64 @invar_cond_incoming_ops_reordered( 16834777c23SFlorian Hahn; CHECK-SAME: i1 [[C:%.*]]) { 16934777c23SFlorian Hahn; CHECK-NEXT: entry: 17034777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 17134777c23SFlorian Hahn; CHECK: vector.ph: 17234777c23SFlorian Hahn; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i1> poison, i1 [[C]], i64 0 17334777c23SFlorian Hahn; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i1> [[BROADCAST_SPLATINSERT]], <4 x i1> poison, <4 x i32> zeroinitializer 174*f0d5104cSLuke Lau; CHECK-NEXT: [[TMP1:%.*]] = xor <4 x i1> [[BROADCAST_SPLAT]], splat (i1 true) 175*f0d5104cSLuke Lau; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP1]], <4 x i64> splat (i64 1), <4 x i64> zeroinitializer 17634777c23SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 17734777c23SFlorian Hahn; CHECK: vector.body: 17834777c23SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 17934777c23SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 18034777c23SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000 18134777c23SFlorian Hahn; CHECK-NEXT: br i1 [[TMP0]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]] 18234777c23SFlorian Hahn; CHECK: middle.block: 18334777c23SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i64> [[PREDPHI]], i32 3 18434777c23SFlorian Hahn; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[SCALAR_PH]] 18534777c23SFlorian Hahn; CHECK: scalar.ph: 18634777c23SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 1000, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 18734777c23SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 18834777c23SFlorian Hahn; CHECK: loop.header: 18934777c23SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 19034777c23SFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[LOOP_LATCH]], label [[THEN:%.*]] 19134777c23SFlorian Hahn; CHECK: then: 19234777c23SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 19334777c23SFlorian Hahn; CHECK: loop.latch: 19434777c23SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = phi i64 [ 0, [[LOOP_HEADER]] ], [ 1, [[THEN]] ] 19534777c23SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 19634777c23SFlorian Hahn; CHECK-NEXT: [[ICMP:%.*]] = icmp sgt i32 [[IV]], 1000 19734777c23SFlorian Hahn; CHECK-NEXT: br i1 [[ICMP]], label [[EXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP9:![0-9]+]] 19834777c23SFlorian Hahn; CHECK: exit: 19934777c23SFlorian Hahn; CHECK-NEXT: [[R_LCSSA:%.*]] = phi i64 [ [[R]], [[LOOP_LATCH]] ], [ [[TMP2]], [[MIDDLE_BLOCK]] ] 20034777c23SFlorian Hahn; CHECK-NEXT: ret i64 [[R_LCSSA]] 20134777c23SFlorian Hahn; 20234777c23SFlorian Hahnentry: 20334777c23SFlorian Hahn br label %loop.header 20434777c23SFlorian Hahn 20534777c23SFlorian Hahnloop.header: 20634777c23SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 20734777c23SFlorian Hahn br i1 %c, label %loop.latch, label %then 20834777c23SFlorian Hahn 20934777c23SFlorian Hahnthen: 21034777c23SFlorian Hahn br label %loop.latch 21134777c23SFlorian Hahn 21234777c23SFlorian Hahnloop.latch: 21334777c23SFlorian Hahn %r = phi i64 [ 0, %loop.header ], [ 1, %then ] 21434777c23SFlorian Hahn %iv.next = add i32 %iv, 1 21534777c23SFlorian Hahn %icmp = icmp sgt i32 %iv, 1000 21634777c23SFlorian Hahn br i1 %icmp, label %exit, label %loop.header 21734777c23SFlorian Hahn 21834777c23SFlorian Hahnexit: 21934777c23SFlorian Hahn %r.lcssa = phi i64 [ %r, %loop.latch ] 22034777c23SFlorian Hahn ret i64 %r.lcssa 22134777c23SFlorian Hahn} 22234777c23SFlorian Hahn;. 22334777c23SFlorian Hahn; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]} 22434777c23SFlorian Hahn; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1} 22534777c23SFlorian Hahn; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"} 22634777c23SFlorian Hahn; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]} 22734777c23SFlorian Hahn; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]} 22834777c23SFlorian Hahn; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]} 22934777c23SFlorian Hahn; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]} 23034777c23SFlorian Hahn; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META2]], [[META1]]} 23134777c23SFlorian Hahn; CHECK: [[LOOP8]] = distinct !{[[LOOP8]], [[META1]], [[META2]]} 23234777c23SFlorian Hahn; CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META2]], [[META1]]} 23334777c23SFlorian Hahn;. 234