Files
TheRock/compiler/amd-llvm/llvm/test/tools/llubi/controlflow.ll
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

431 lines
19 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llubi_test_checks.py UTC_ARGS: --version 6
; RUN: llubi --verbose < %s 2>&1 | FileCheck %s
define i32 @factorial_iterative(i32 %n) {
entry:
br label %loop.body
loop.body:
%i = phi i32 [ 1, %entry ], [ %i.next, %loop.body ]
%acc = phi i32 [ 1, %entry ], [ %acc.next, %loop.body ]
%acc.next = mul i32 %acc, %i
%i.next = add i32 %i, 1
%cond = icmp eq i32 %i, %n
br i1 %cond, label %loop.end, label %loop.body
loop.end:
ret i32 %acc.next
}
define i32 @factorial_recursive(i32 %x) {
entry:
%cond = icmp eq i32 %x, 0
br i1 %cond, label %base.case, label %recursive.case
base.case:
ret i32 1
recursive.case:
%x.prev = add i32 %x, -1
%recursive.result = call i32 @factorial_recursive(i32 %x.prev)
%result = mul i32 %x, %recursive.result
ret i32 %result
}
define i32 @get_n(i32 %x) {
%x.next = add i32 %x, 1
ret i32 %x.next
}
define i32 @fib(ptr %self, i32 %n) {
%cond = icmp ugt i32 %n, 1
br i1 %cond, label %if.then, label %if.else
if.then:
%sub1 = sub i32 %n, 1
%sub2 = sub i32 %n, 2
%res1 = call i32 @fib(ptr %self, i32 %sub1)
%res2 = call i32 @fib(ptr %self, i32 %sub2)
%result = add i32 %res1, %res2
ret i32 %result
if.else:
ret i32 1
}
define i32 @fib_iterative(i32 %n) {
entry:
br label %loop.body
loop.body:
%phi = phi i32 [ %n, %entry ], [ %sub1, %loop.body ]
; Make sure %fib2 is not updated before %fib1.
%fib2 = phi i32 [ 1, %entry ], [ %add, %loop.body ]
%fib1 = phi i32 [ 1, %entry ], [ %fib2, %loop.body ]
%sub1 = sub i32 %phi, 1
%add = add i32 %fib1, %fib2
%loop.cond = icmp ugt i32 %phi, 1
br i1 %loop.cond, label %loop.body, label %exit
exit:
ret i32 %fib2
}
define i32 @main() {
; params & retval
%n = call i32 @get_n(i32 4)
; loops
%result_iterative = call i32 @factorial_iterative(i32 %n)
; recursion
%result_recursive = call i32 @factorial_recursive(i32 %n)
; intrinsics
%cmp = icmp eq i32 %result_iterative, %result_recursive
call void @llvm.assume(i1 %cmp)
; switch -> case destination
switch i32 %result_iterative, label %exit [
i32 120, label %next1
]
next1:
; switch -> default destination
switch i32 %result_recursive, label %next2 [
i32 0, label %exit
]
next2:
; call blackbox
call void asm sideeffect "", ""()
; invoke blackbox
invoke void asm sideeffect "", ""() to label %next3 unwind label %cleanup
next3:
; callbr blackbox
callbr void asm sideeffect "", ""() to label %next4 []
next4:
; invoke
%res = invoke i32 @get_n(i32 0) to label %next5 unwind label %cleanup
next5:
; indirectbr
indirectbr ptr blockaddress(@main, %exit), [ label %exit ]
cleanup:
landingpad {} cleanup
ret i32 1
exit:
; indirect call
%fib5_v1 = call i32 @fib(ptr @fib, i32 5)
%fib5_v2 = call i32 @fib_iterative(i32 5)
%test = icmp ne i32 %fib5_v1, %fib5_v2
%ret = zext i1 %test to i32
ret i32 %ret
}
; CHECK: Entering function: main
; CHECK-NEXT: Entering function: get_n
; CHECK-NEXT: i32 %x = i32 4
; CHECK-NEXT: %x.next = add i32 %x, 1 => i32 5
; CHECK-NEXT: ret i32 %x.next
; CHECK-NEXT: Exiting function: get_n
; CHECK-NEXT: %n = call i32 @get_n(i32 4) => i32 5
; CHECK-NEXT: Entering function: factorial_iterative
; CHECK-NEXT: i32 %n = i32 5
; CHECK-NEXT: br label %loop.body jump to %loop.body
; CHECK-NEXT: %i = phi i32 [ 1, %entry ], [ %i.next, %loop.body ] => i32 1
; CHECK-NEXT: %acc = phi i32 [ 1, %entry ], [ %acc.next, %loop.body ] => i32 1
; CHECK-NEXT: %acc.next = mul i32 %acc, %i => i32 1
; CHECK-NEXT: %i.next = add i32 %i, 1 => i32 2
; CHECK-NEXT: %cond = icmp eq i32 %i, %n => F
; CHECK-NEXT: br i1 %cond, label %loop.end, label %loop.body jump to %loop.body
; CHECK-NEXT: %i = phi i32 [ 1, %entry ], [ %i.next, %loop.body ] => i32 2
; CHECK-NEXT: %acc = phi i32 [ 1, %entry ], [ %acc.next, %loop.body ] => i32 1
; CHECK-NEXT: %acc.next = mul i32 %acc, %i => i32 2
; CHECK-NEXT: %i.next = add i32 %i, 1 => i32 3
; CHECK-NEXT: %cond = icmp eq i32 %i, %n => F
; CHECK-NEXT: br i1 %cond, label %loop.end, label %loop.body jump to %loop.body
; CHECK-NEXT: %i = phi i32 [ 1, %entry ], [ %i.next, %loop.body ] => i32 3
; CHECK-NEXT: %acc = phi i32 [ 1, %entry ], [ %acc.next, %loop.body ] => i32 2
; CHECK-NEXT: %acc.next = mul i32 %acc, %i => i32 6
; CHECK-NEXT: %i.next = add i32 %i, 1 => i32 4
; CHECK-NEXT: %cond = icmp eq i32 %i, %n => F
; CHECK-NEXT: br i1 %cond, label %loop.end, label %loop.body jump to %loop.body
; CHECK-NEXT: %i = phi i32 [ 1, %entry ], [ %i.next, %loop.body ] => i32 4
; CHECK-NEXT: %acc = phi i32 [ 1, %entry ], [ %acc.next, %loop.body ] => i32 6
; CHECK-NEXT: %acc.next = mul i32 %acc, %i => i32 24
; CHECK-NEXT: %i.next = add i32 %i, 1 => i32 5
; CHECK-NEXT: %cond = icmp eq i32 %i, %n => F
; CHECK-NEXT: br i1 %cond, label %loop.end, label %loop.body jump to %loop.body
; CHECK-NEXT: %i = phi i32 [ 1, %entry ], [ %i.next, %loop.body ] => i32 5
; CHECK-NEXT: %acc = phi i32 [ 1, %entry ], [ %acc.next, %loop.body ] => i32 24
; CHECK-NEXT: %acc.next = mul i32 %acc, %i => i32 120
; CHECK-NEXT: %i.next = add i32 %i, 1 => i32 6
; CHECK-NEXT: %cond = icmp eq i32 %i, %n => T
; CHECK-NEXT: br i1 %cond, label %loop.end, label %loop.body jump to %loop.end
; CHECK-NEXT: ret i32 %acc.next
; CHECK-NEXT: Exiting function: factorial_iterative
; CHECK-NEXT: %result_iterative = call i32 @factorial_iterative(i32 %n) => i32 120
; CHECK-NEXT: Entering function: factorial_recursive
; CHECK-NEXT: i32 %x = i32 5
; CHECK-NEXT: %cond = icmp eq i32 %x, 0 => F
; CHECK-NEXT: br i1 %cond, label %base.case, label %recursive.case jump to %recursive.case
; CHECK-NEXT: %x.prev = add i32 %x, -1 => i32 4
; CHECK-NEXT: Entering function: factorial_recursive
; CHECK-NEXT: i32 %x = i32 4
; CHECK-NEXT: %cond = icmp eq i32 %x, 0 => F
; CHECK-NEXT: br i1 %cond, label %base.case, label %recursive.case jump to %recursive.case
; CHECK-NEXT: %x.prev = add i32 %x, -1 => i32 3
; CHECK-NEXT: Entering function: factorial_recursive
; CHECK-NEXT: i32 %x = i32 3
; CHECK-NEXT: %cond = icmp eq i32 %x, 0 => F
; CHECK-NEXT: br i1 %cond, label %base.case, label %recursive.case jump to %recursive.case
; CHECK-NEXT: %x.prev = add i32 %x, -1 => i32 2
; CHECK-NEXT: Entering function: factorial_recursive
; CHECK-NEXT: i32 %x = i32 2
; CHECK-NEXT: %cond = icmp eq i32 %x, 0 => F
; CHECK-NEXT: br i1 %cond, label %base.case, label %recursive.case jump to %recursive.case
; CHECK-NEXT: %x.prev = add i32 %x, -1 => i32 1
; CHECK-NEXT: Entering function: factorial_recursive
; CHECK-NEXT: i32 %x = i32 1
; CHECK-NEXT: %cond = icmp eq i32 %x, 0 => F
; CHECK-NEXT: br i1 %cond, label %base.case, label %recursive.case jump to %recursive.case
; CHECK-NEXT: %x.prev = add i32 %x, -1 => i32 0
; CHECK-NEXT: Entering function: factorial_recursive
; CHECK-NEXT: i32 %x = i32 0
; CHECK-NEXT: %cond = icmp eq i32 %x, 0 => T
; CHECK-NEXT: br i1 %cond, label %base.case, label %recursive.case jump to %base.case
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: factorial_recursive
; CHECK-NEXT: %recursive.result = call i32 @factorial_recursive(i32 %x.prev) => i32 1
; CHECK-NEXT: %result = mul i32 %x, %recursive.result => i32 1
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: factorial_recursive
; CHECK-NEXT: %recursive.result = call i32 @factorial_recursive(i32 %x.prev) => i32 1
; CHECK-NEXT: %result = mul i32 %x, %recursive.result => i32 2
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: factorial_recursive
; CHECK-NEXT: %recursive.result = call i32 @factorial_recursive(i32 %x.prev) => i32 2
; CHECK-NEXT: %result = mul i32 %x, %recursive.result => i32 6
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: factorial_recursive
; CHECK-NEXT: %recursive.result = call i32 @factorial_recursive(i32 %x.prev) => i32 6
; CHECK-NEXT: %result = mul i32 %x, %recursive.result => i32 24
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: factorial_recursive
; CHECK-NEXT: %recursive.result = call i32 @factorial_recursive(i32 %x.prev) => i32 24
; CHECK-NEXT: %result = mul i32 %x, %recursive.result => i32 120
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: factorial_recursive
; CHECK-NEXT: %result_recursive = call i32 @factorial_recursive(i32 %n) => i32 120
; CHECK-NEXT: %cmp = icmp eq i32 %result_iterative, %result_recursive => T
; CHECK-NEXT: call void @llvm.assume(i1 %cmp)
; CHECK-NEXT: switch i32 %result_iterative, label %exit [
; CHECK-NEXT: i32 120, label %next1
; CHECK-NEXT: ] jump to %next1
; CHECK-NEXT: switch i32 %result_recursive, label %next2 [
; CHECK-NEXT: i32 0, label %exit
; CHECK-NEXT: ] jump to %next2
; CHECK-NEXT: call void asm sideeffect "", ""()
; CHECK-NEXT: invoke void asm sideeffect "", ""()
; CHECK-NEXT: to label %next3 unwind label %cleanup
; CHECK-NEXT: invoke void asm sideeffect "", ""()
; CHECK-NEXT: to label %next3 unwind label %cleanup jump to %next3
; CHECK-NEXT: callbr void asm sideeffect "", ""()
; CHECK-NEXT: to label %next4 [] jump to %next4
; CHECK-NEXT: Entering function: get_n
; CHECK-NEXT: i32 %x = i32 0
; CHECK-NEXT: %x.next = add i32 %x, 1 => i32 1
; CHECK-NEXT: ret i32 %x.next
; CHECK-NEXT: Exiting function: get_n
; CHECK-NEXT: %res = invoke i32 @get_n(i32 0)
; CHECK-NEXT: to label %next5 unwind label %cleanup => i32 1
; CHECK-NEXT: %res = invoke i32 @get_n(i32 0)
; CHECK-NEXT: to label %next5 unwind label %cleanup jump to %next5
; CHECK-NEXT: indirectbr ptr blockaddress(@main, %exit), [label %exit] jump to %exit
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 5
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => T
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.then
; CHECK-NEXT: %sub1 = sub i32 %n, 1 => i32 4
; CHECK-NEXT: %sub2 = sub i32 %n, 2 => i32 3
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 4
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => T
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.then
; CHECK-NEXT: %sub1 = sub i32 %n, 1 => i32 3
; CHECK-NEXT: %sub2 = sub i32 %n, 2 => i32 2
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 3
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => T
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.then
; CHECK-NEXT: %sub1 = sub i32 %n, 1 => i32 2
; CHECK-NEXT: %sub2 = sub i32 %n, 2 => i32 1
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 2
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => T
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.then
; CHECK-NEXT: %sub1 = sub i32 %n, 1 => i32 1
; CHECK-NEXT: %sub2 = sub i32 %n, 2 => i32 0
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 1
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => F
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.else
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res1 = call i32 @fib(ptr %self, i32 %sub1) => i32 1
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 0
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => F
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.else
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res2 = call i32 @fib(ptr %self, i32 %sub2) => i32 1
; CHECK-NEXT: %result = add i32 %res1, %res2 => i32 2
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res1 = call i32 @fib(ptr %self, i32 %sub1) => i32 2
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 1
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => F
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.else
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res2 = call i32 @fib(ptr %self, i32 %sub2) => i32 1
; CHECK-NEXT: %result = add i32 %res1, %res2 => i32 3
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res1 = call i32 @fib(ptr %self, i32 %sub1) => i32 3
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 2
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => T
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.then
; CHECK-NEXT: %sub1 = sub i32 %n, 1 => i32 1
; CHECK-NEXT: %sub2 = sub i32 %n, 2 => i32 0
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 1
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => F
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.else
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res1 = call i32 @fib(ptr %self, i32 %sub1) => i32 1
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 0
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => F
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.else
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res2 = call i32 @fib(ptr %self, i32 %sub2) => i32 1
; CHECK-NEXT: %result = add i32 %res1, %res2 => i32 2
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res2 = call i32 @fib(ptr %self, i32 %sub2) => i32 2
; CHECK-NEXT: %result = add i32 %res1, %res2 => i32 5
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res1 = call i32 @fib(ptr %self, i32 %sub1) => i32 5
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 3
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => T
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.then
; CHECK-NEXT: %sub1 = sub i32 %n, 1 => i32 2
; CHECK-NEXT: %sub2 = sub i32 %n, 2 => i32 1
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 2
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => T
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.then
; CHECK-NEXT: %sub1 = sub i32 %n, 1 => i32 1
; CHECK-NEXT: %sub2 = sub i32 %n, 2 => i32 0
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 1
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => F
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.else
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res1 = call i32 @fib(ptr %self, i32 %sub1) => i32 1
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 0
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => F
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.else
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res2 = call i32 @fib(ptr %self, i32 %sub2) => i32 1
; CHECK-NEXT: %result = add i32 %res1, %res2 => i32 2
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res1 = call i32 @fib(ptr %self, i32 %sub1) => i32 2
; CHECK-NEXT: Entering function: fib
; CHECK-NEXT: ptr %self = ptr 0x8 [@fib]
; CHECK-NEXT: i32 %n = i32 1
; CHECK-NEXT: %cond = icmp ugt i32 %n, 1 => F
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.else jump to %if.else
; CHECK-NEXT: ret i32 1
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res2 = call i32 @fib(ptr %self, i32 %sub2) => i32 1
; CHECK-NEXT: %result = add i32 %res1, %res2 => i32 3
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %res2 = call i32 @fib(ptr %self, i32 %sub2) => i32 3
; CHECK-NEXT: %result = add i32 %res1, %res2 => i32 8
; CHECK-NEXT: ret i32 %result
; CHECK-NEXT: Exiting function: fib
; CHECK-NEXT: %fib5_v1 = call i32 @fib(ptr @fib, i32 5) => i32 8
; CHECK-NEXT: Entering function: fib_iterative
; CHECK-NEXT: i32 %n = i32 5
; CHECK-NEXT: br label %loop.body jump to %loop.body
; CHECK-NEXT: %phi = phi i32 [ %n, %entry ], [ %sub1, %loop.body ] => i32 5
; CHECK-NEXT: %fib2 = phi i32 [ 1, %entry ], [ %add, %loop.body ] => i32 1
; CHECK-NEXT: %fib1 = phi i32 [ 1, %entry ], [ %fib2, %loop.body ] => i32 1
; CHECK-NEXT: %sub1 = sub i32 %phi, 1 => i32 4
; CHECK-NEXT: %add = add i32 %fib1, %fib2 => i32 2
; CHECK-NEXT: %loop.cond = icmp ugt i32 %phi, 1 => T
; CHECK-NEXT: br i1 %loop.cond, label %loop.body, label %exit jump to %loop.body
; CHECK-NEXT: %phi = phi i32 [ %n, %entry ], [ %sub1, %loop.body ] => i32 4
; CHECK-NEXT: %fib2 = phi i32 [ 1, %entry ], [ %add, %loop.body ] => i32 2
; CHECK-NEXT: %fib1 = phi i32 [ 1, %entry ], [ %fib2, %loop.body ] => i32 1
; CHECK-NEXT: %sub1 = sub i32 %phi, 1 => i32 3
; CHECK-NEXT: %add = add i32 %fib1, %fib2 => i32 3
; CHECK-NEXT: %loop.cond = icmp ugt i32 %phi, 1 => T
; CHECK-NEXT: br i1 %loop.cond, label %loop.body, label %exit jump to %loop.body
; CHECK-NEXT: %phi = phi i32 [ %n, %entry ], [ %sub1, %loop.body ] => i32 3
; CHECK-NEXT: %fib2 = phi i32 [ 1, %entry ], [ %add, %loop.body ] => i32 3
; CHECK-NEXT: %fib1 = phi i32 [ 1, %entry ], [ %fib2, %loop.body ] => i32 2
; CHECK-NEXT: %sub1 = sub i32 %phi, 1 => i32 2
; CHECK-NEXT: %add = add i32 %fib1, %fib2 => i32 5
; CHECK-NEXT: %loop.cond = icmp ugt i32 %phi, 1 => T
; CHECK-NEXT: br i1 %loop.cond, label %loop.body, label %exit jump to %loop.body
; CHECK-NEXT: %phi = phi i32 [ %n, %entry ], [ %sub1, %loop.body ] => i32 2
; CHECK-NEXT: %fib2 = phi i32 [ 1, %entry ], [ %add, %loop.body ] => i32 5
; CHECK-NEXT: %fib1 = phi i32 [ 1, %entry ], [ %fib2, %loop.body ] => i32 3
; CHECK-NEXT: %sub1 = sub i32 %phi, 1 => i32 1
; CHECK-NEXT: %add = add i32 %fib1, %fib2 => i32 8
; CHECK-NEXT: %loop.cond = icmp ugt i32 %phi, 1 => T
; CHECK-NEXT: br i1 %loop.cond, label %loop.body, label %exit jump to %loop.body
; CHECK-NEXT: %phi = phi i32 [ %n, %entry ], [ %sub1, %loop.body ] => i32 1
; CHECK-NEXT: %fib2 = phi i32 [ 1, %entry ], [ %add, %loop.body ] => i32 8
; CHECK-NEXT: %fib1 = phi i32 [ 1, %entry ], [ %fib2, %loop.body ] => i32 5
; CHECK-NEXT: %sub1 = sub i32 %phi, 1 => i32 0
; CHECK-NEXT: %add = add i32 %fib1, %fib2 => i32 13
; CHECK-NEXT: %loop.cond = icmp ugt i32 %phi, 1 => F
; CHECK-NEXT: br i1 %loop.cond, label %loop.body, label %exit jump to %exit
; CHECK-NEXT: ret i32 %fib2
; CHECK-NEXT: Exiting function: fib_iterative
; CHECK-NEXT: %fib5_v2 = call i32 @fib_iterative(i32 5) => i32 8
; CHECK-NEXT: %test = icmp ne i32 %fib5_v1, %fib5_v2 => F
; CHECK-NEXT: %ret = zext i1 %test to i32 => i32 0
; CHECK-NEXT: ret i32 %ret
; CHECK-NEXT: Exiting function: main