| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | |
| ; RUN: opt -passes=indvars -S %s | FileCheck %s | |
| define void @test_phi_select() { | |
| ; CHECK-LABEL: @test_phi_select( | |
| ; CHECK-NEXT: entry: | |
| ; CHECK-NEXT: br label [[OUTER_HEADER:%.*]] | |
| ; CHECK: outer.header: | |
| ; CHECK-NEXT: br i1 false, label [[THEN:%.*]], label [[MERGE:%.*]] | |
| ; CHECK: then: | |
| ; CHECK-NEXT: br label [[MERGE]] | |
| ; CHECK: merge: | |
| ; CHECK-NEXT: br label [[INNER:%.*]] | |
| ; CHECK: inner: | |
| ; CHECK-NEXT: [[INNER_IV_NEXT:%.*]] = add nsw i64 0, 0 | |
| ; CHECK-NEXT: br i1 false, label [[INNER]], label [[OUTER_LATCH:%.*]] | |
| ; CHECK: outer.latch: | |
| ; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[OUTER_HEADER]] | |
| ; CHECK: exit: | |
| ; CHECK-NEXT: ret void | |
| ; | |
| entry: | |
| br label %outer.header | |
| outer.header: | |
| %iv = phi i64 [ 0, %entry ], [ %iv.next, %outer.latch ] | |
| %iv.next.1 = add nsw i64 %iv, 1 | |
| %cmp.0 = icmp sgt i64 %iv, 50 | |
| br i1 %cmp.0, label %then, label %merge | |
| then: | |
| br label %merge | |
| merge: | |
| %iv.sel = phi i64 [ %iv, %outer.header ], [ %iv.next.1, %then ] | |
| br label %inner | |
| inner: ; preds = %inner, %outer.header.new | |
| %inner.iv = phi i64 [ %iv.sel, %merge ], [ 0, %inner ] | |
| %inner.iv.next = add nsw i64 0, 0 | |
| %ec.1 = icmp sgt i64 0, 0 | |
| br i1 %ec.1, label %inner, label %outer.latch | |
| outer.latch: | |
| %iv.next = add nuw nsw i64 %iv, 1 | |
| %ec.2 = icmp ult i64 %iv.next, 1000 | |
| br i1 %ec.2, label %exit, label %outer.header | |
| exit: | |
| ret void | |
| } |