blob: 193ce0a4a2f2e6f0e6df7c590b138c9e1fde7de2 [file] [edit]
; 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
}