68 lines
1.7 KiB
LLVM
68 lines
1.7 KiB
LLVM
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||
|
target triple = "x86_64-grtev4-linux-gnu"
|
||
|
|
||
|
declare void @external_fct(i32)
|
||
|
|
||
|
define dso_local i32 @top() {
|
||
|
%a = call i32 @multiplier(i32 5)
|
||
|
%b = call i32 @adder(i32 10)
|
||
|
%ret = add nsw i32 %a, %b
|
||
|
call void @external_fct(i32 %ret)
|
||
|
ret i32 %ret
|
||
|
}
|
||
|
|
||
|
define internal dso_local i32 @adder(i32) {
|
||
|
%2 = alloca i32, align 4
|
||
|
store i32 %0, i32* %2, align 4
|
||
|
%3 = load i32, i32* %2, align 4
|
||
|
%4 = call i32 @multiplier(i32 %3)
|
||
|
%5 = load i32, i32* %2, align 4
|
||
|
%6 = call i32 @switcher(i32 1)
|
||
|
%7 = add nsw i32 %4, %6
|
||
|
ret i32 %7
|
||
|
}
|
||
|
|
||
|
define internal i32 @multiplier(i32) {
|
||
|
%2 = alloca i32, align 4
|
||
|
store i32 %0, i32* %2, align 4
|
||
|
%3 = load i32, i32* %2, align 4
|
||
|
%4 = load i32, i32* %2, align 4
|
||
|
%5 = mul nsw i32 %3, %4
|
||
|
ret i32 %5
|
||
|
}
|
||
|
|
||
|
define i32 @switcher(i32) {
|
||
|
%2 = alloca i32, align 4
|
||
|
%3 = alloca i32, align 4
|
||
|
store i32 %0, i32* %3, align 4
|
||
|
%4 = load i32, i32* %3, align 4
|
||
|
switch i32 %4, label %11 [
|
||
|
i32 1, label %5
|
||
|
i32 2, label %6
|
||
|
]
|
||
|
|
||
|
; <label>:5: ; preds = %1
|
||
|
store i32 2, i32* %2, align 4
|
||
|
br label %12
|
||
|
|
||
|
; <label>:6: ; preds = %1
|
||
|
%7 = load i32, i32* %3, align 4
|
||
|
%8 = load i32, i32* %3, align 4
|
||
|
%9 = call i32 @multiplier(i32 %8)
|
||
|
%10 = add nsw i32 %7, %9
|
||
|
store i32 %10, i32* %2, align 4
|
||
|
br label %12
|
||
|
|
||
|
; <label>:11: ; preds = %1
|
||
|
%adder.result = call i32 @adder(i32 2)
|
||
|
store i32 %adder.result, i32* %2, align 4
|
||
|
br label %12
|
||
|
|
||
|
; <label>:12: ; preds = %11, %6, %5
|
||
|
%13 = load i32, i32* %2, align 4
|
||
|
ret i32 %13
|
||
|
}
|
||
|
|
||
|
; CHECK-NOT: @adder
|
||
|
; DEFAULT-LABEL: @adder
|
||
|
; DEFAULT-NEXT: %2 = mul
|