| 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 |