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
431 lines
19 KiB
LLVM
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
|