| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt -S -passes=structurizecfg %s -o - | FileCheck %s | |
| ; The backedge targets a flow block in front of h. It must loop back, not exit. | |
| define i32 @f(i32 %s) { | |
| ; CHECK-LABEL: define i32 @f( | |
| ; CHECK-SAME: i32 [[S:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*]]: | |
| ; CHECK-NEXT: [[C0:%.*]] = trunc i32 [[S]] to i1 | |
| ; CHECK-NEXT: [[C0_INV:%.*]] = xor i1 [[C0]], true | |
| ; CHECK-NEXT: br label %[[FLOW:.*]] | |
| ; CHECK: [[FLOW]]: | |
| ; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[TMP4:%.*]], %[[FLOW1:.*]] ], [ poison, %[[ENTRY]] ] | |
| ; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[TMP5:%.*]], %[[FLOW1]] ], [ 0, %[[ENTRY]] ] | |
| ; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ [[TMP7:%.*]], %[[FLOW1]] ], [ [[C0_INV]], %[[ENTRY]] ] | |
| ; CHECK-NEXT: [[TMP3:%.*]] = phi i1 [ true, %[[FLOW1]] ], [ [[C0]], %[[ENTRY]] ] | |
| ; CHECK-NEXT: br i1 [[TMP3]], label %[[H:.*]], label %[[FLOW1]] | |
| ; CHECK: [[H]]: | |
| ; CHECK-NEXT: [[I1:%.*]] = add i32 [[TMP1]], 1 | |
| ; CHECK-NEXT: [[C1:%.*]] = icmp ult i32 [[I1]], [[S]] | |
| ; CHECK-NEXT: br i1 [[C1]], label %[[L:.*]], label %[[FLOW2:.*]] | |
| ; CHECK: [[FLOW1]]: | |
| ; CHECK-NEXT: [[TMP4]] = phi i32 [ [[I1]], %[[FLOW2]] ], [ [[TMP0]], %[[FLOW]] ] | |
| ; CHECK-NEXT: [[TMP5]] = phi i32 [ [[I1]], %[[FLOW2]] ], [ [[TMP1]], %[[FLOW]] ] | |
| ; CHECK-NEXT: [[TMP6:%.*]] = phi i1 [ [[TMP8:%.*]], %[[FLOW2]] ], [ true, %[[FLOW]] ] | |
| ; CHECK-NEXT: [[TMP7]] = phi i1 [ [[TMP9:%.*]], %[[FLOW2]] ], [ [[TMP2]], %[[FLOW]] ] | |
| ; CHECK-NEXT: br i1 [[TMP6]], label %[[FLOW3:.*]], label %[[FLOW]] | |
| ; CHECK: [[L]]: | |
| ; CHECK-NEXT: [[C2:%.*]] = icmp uge i32 [[I1]], 3 | |
| ; CHECK-NEXT: br label %[[FLOW2]] | |
| ; CHECK: [[FLOW2]]: | |
| ; CHECK-NEXT: [[TMP8]] = phi i1 [ [[C2]], %[[L]] ], [ true, %[[H]] ] | |
| ; CHECK-NEXT: [[TMP9]] = phi i1 [ [[C2]], %[[L]] ], [ [[TMP2]], %[[H]] ] | |
| ; CHECK-NEXT: br label %[[FLOW1]] | |
| ; CHECK: [[FLOW3]]: | |
| ; CHECK-NEXT: br i1 [[TMP7]], label %[[OTHER:.*]], label %[[RET:.*]] | |
| ; CHECK: [[OTHER]]: | |
| ; CHECK-NEXT: br label %[[RET]] | |
| ; CHECK: [[RET]]: | |
| ; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[TMP4]], %[[FLOW3]] ], [ 0, %[[OTHER]] ] | |
| ; CHECK-NEXT: ret i32 [[R]] | |
| ; | |
| entry: | |
| %c0 = trunc i32 %s to i1 | |
| br i1 %c0, label %h, label %other | |
| h: | |
| %i = phi i32 [ 0, %entry ], [ %i1, %l ] | |
| %i1 = add i32 %i, 1 | |
| %c1 = icmp ult i32 %i1, %s | |
| br i1 %c1, label %l, label %ret | |
| l: | |
| %c2 = icmp ult i32 %i1, 3 | |
| br i1 %c2, label %h, label %other | |
| other: | |
| br label %ret | |
| ret: | |
| %r = phi i32 [ %i1, %h ], [ 0, %other ] | |
| ret i32 %r | |
| } |