| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt -S -passes=loop-fusion < %s 2>&1 | FileCheck %s |
| |
| ; Tests when the second loop preheader has a phi coming from the first loop |
| ; exit. If the phi is not used in the second loop, the loops can be fused and |
| ; the phi is sunk to the fused loop exit. If the phi is used in the second loop, |
| ; the loops cannot be fused. |
| |
| define void @test1() { |
| ; CHECK-LABEL: @test1( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[VECTOR_PH:%.*]] |
| ; CHECK: vector.ph: |
| ; CHECK-NEXT: br label [[MIDDLE_BLOCK:%.*]] |
| ; CHECK: middle.block: |
| ; CHECK-NEXT: br i1 true, label [[FOR_END41:%.*]], label [[VECTOR_PH]] |
| ; CHECK: for.end41: |
| ; CHECK-NEXT: [[DOTLCSSA92:%.*]] = phi i16 [ 1, [[MIDDLE_BLOCK]] ] |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %vector.ph |
| |
| vector.ph: ; preds = %middle.block, %entry |
| br label %middle.block |
| |
| middle.block: ; preds = %vector.ph |
| br i1 true, label %for.cond17.preheader, label %vector.ph |
| |
| for.cond17.preheader: ; preds = %middle.block |
| %.lcssa92 = phi i16 [ 1, %middle.block ] |
| br label %vector.ph61 |
| |
| vector.ph61: ; preds = %middle.block59, %for.cond17.preheader |
| br i1 true, label %for.end41, label %vector.ph61 |
| |
| for.end41: ; preds = %middle.block59 |
| ret void |
| } |
| |
| define void @test2() { |
| ; CHECK-LABEL: @test2( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[VECTOR_PH:%.*]] |
| ; CHECK: vector.ph: |
| ; CHECK-NEXT: br label [[MIDDLE_BLOCK:%.*]] |
| ; CHECK: middle.block: |
| ; CHECK-NEXT: br i1 true, label [[FOR_COND17_PREHEADER:%.*]], label [[VECTOR_PH]] |
| ; CHECK: for.cond17.preheader: |
| ; CHECK-NEXT: [[DOTLCSSA92:%.*]] = phi i16 [ 1, [[MIDDLE_BLOCK]] ] |
| ; CHECK-NEXT: br label [[VECTOR_PH61:%.*]] |
| ; CHECK: vector.ph61: |
| ; CHECK-NEXT: call void @a(i16 [[DOTLCSSA92]]) |
| ; CHECK-NEXT: br i1 true, label [[FOR_END41:%.*]], label [[VECTOR_PH61]] |
| ; CHECK: for.end41: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %vector.ph |
| |
| vector.ph: ; preds = %middle.block, %entry |
| br label %middle.block |
| |
| middle.block: ; preds = %vector.ph |
| br i1 true, label %for.cond17.preheader, label %vector.ph |
| |
| for.cond17.preheader: ; preds = %middle.block |
| %.lcssa92 = phi i16 [ 1, %middle.block ] |
| br label %vector.ph61 |
| |
| vector.ph61: ; preds = %middle.block59, %for.cond17.preheader |
| call void @a(i16 %.lcssa92) |
| br i1 true, label %for.end41, label %vector.ph61 |
| |
| for.end41: ; preds = %middle.block59 |
| ret void |
| } |
| |
| declare void @a(i16); |