66; In the 2 test cases below, we have a LCSSA PHI in the inner loop exit, which
77; is used in the outer loop latch. This is not supported.
88
9- define void @test1 () {
9+ define void @test1 (i1 %arg ) {
1010; CHECK-LABEL: @test1(
1111; CHECK-NEXT: entry:
1212; CHECK-NEXT: br label [[OUTER_HEADER:%.*]]
@@ -19,12 +19,12 @@ define void @test1() {
1919; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[IDX]], align 8
2020; CHECK-NEXT: store double undef, ptr [[IDX]], align 8
2121; CHECK-NEXT: [[INNER_IV_NEXT]] = add nuw nsw i64 [[INNER_IV]], 1
22- ; CHECK-NEXT: br i1 false , label [[INNER]], label [[OUTER_LATCH]]
22+ ; CHECK-NEXT: br i1 [[ARG:%.*]] , label [[INNER]], label [[OUTER_LATCH]]
2323; CHECK: outer.latch:
2424; CHECK-NEXT: [[INC43_LCSSA_WIDE_US:%.*]] = phi i64 [ [[INNER_IV_NEXT]], [[INNER]] ]
2525; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[INC43_LCSSA_WIDE_US]] to i32
2626; CHECK-NEXT: [[OUTER_IV_NEXT]] = add nsw i64 [[OUTER_IV]], 1
27- ; CHECK-NEXT: br i1 false , label [[OUTER_HEADER]], label [[OUTER_EXIT:%.*]]
27+ ; CHECK-NEXT: br i1 [[ARG]] , label [[OUTER_HEADER]], label [[OUTER_EXIT:%.*]]
2828; CHECK: outer.exit:
2929; CHECK-NEXT: ret void
3030;
@@ -41,20 +41,20 @@ inner: ; preds = %for.body28.us, %for.body25.
4141 %0 = load double , ptr %idx , align 8
4242 store double undef , ptr %idx , align 8
4343 %inner.iv.next = add nuw nsw i64 %inner.iv , 1
44- br i1 undef , label %inner , label %outer.latch
44+ br i1 %arg , label %inner , label %outer.latch
4545
4646outer.latch: ; preds = %inner
4747 %inc43.lcssa.wide.us = phi i64 [ %inner.iv.next , %inner ]
4848 %1 = trunc i64 %inc43.lcssa.wide.us to i32
4949 %outer.iv.next = add nsw i64 %outer.iv , 1
50- br i1 undef , label %outer.header , label %outer.exit
50+ br i1 %arg , label %outer.header , label %outer.exit
5151
5252outer.exit: ; preds = %for.cond26.for.end44_crit_edge.us
5353 ret void
5454}
5555
5656; Same as @test1, but with a dedicated inner loop exit block.
57- define void @test2 () {
57+ define void @test2 (i1 %arg ) {
5858; CHECK-LABEL: @test2(
5959; CHECK-NEXT: entry:
6060; CHECK-NEXT: br label [[OUTER_HEADER:%.*]]
@@ -67,14 +67,14 @@ define void @test2() {
6767; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[IDX]], align 8
6868; CHECK-NEXT: store double undef, ptr [[IDX]], align 8
6969; CHECK-NEXT: [[INNER_IV_NEXT]] = add nuw nsw i64 [[INNER_IV]], 1
70- ; CHECK-NEXT: br i1 false , label [[INNER]], label [[INNER_EXIT:%.*]]
70+ ; CHECK-NEXT: br i1 [[ARG:%.*]] , label [[INNER]], label [[INNER_EXIT:%.*]]
7171; CHECK: inner.exit:
7272; CHECK-NEXT: [[INC43_LCSSA_WIDE_US:%.*]] = phi i64 [ [[INNER_IV_NEXT]], [[INNER]] ]
7373; CHECK-NEXT: br label [[OUTER_LATCH]]
7474; CHECK: outer.latch:
7575; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[INC43_LCSSA_WIDE_US]] to i32
7676; CHECK-NEXT: [[OUTER_IV_NEXT]] = add nsw i64 [[OUTER_IV]], 1
77- ; CHECK-NEXT: br i1 false , label [[OUTER_HEADER]], label [[OUTER_EXIT:%.*]]
77+ ; CHECK-NEXT: br i1 [[ARG]] , label [[OUTER_HEADER]], label [[OUTER_EXIT:%.*]]
7878; CHECK: outer.exit:
7979; CHECK-NEXT: ret void
8080;
@@ -91,7 +91,7 @@ inner: ; preds = %for.body28.us, %for.body25.
9191 %0 = load double , ptr %idx , align 8
9292 store double undef , ptr %idx , align 8
9393 %inner.iv.next = add nuw nsw i64 %inner.iv , 1
94- br i1 undef , label %inner , label %inner.exit
94+ br i1 %arg , label %inner , label %inner.exit
9595
9696inner.exit:
9797 %inc43.lcssa.wide.us = phi i64 [ %inner.iv.next , %inner ]
@@ -100,7 +100,7 @@ inner.exit:
100100outer.latch: ; preds = %inner
101101 %1 = trunc i64 %inc43.lcssa.wide.us to i32
102102 %outer.iv.next = add nsw i64 %outer.iv , 1
103- br i1 undef , label %outer.header , label %outer.exit
103+ br i1 %arg , label %outer.header , label %outer.exit
104104
105105outer.exit: ; preds = %for.cond26.for.end44_crit_edge.us
106106 ret void
0 commit comments