| ; RUN: opt < %s -inline -inline-threshold=20 -S -mtriple=aarch64-none-linux | FileCheck %s |
| ; RUN: opt < %s -passes='cgscc(inline)' -inline-threshold=20 -S -mtriple=aarch64-none-linux | FileCheck %s |
| |
| define i32 @callee_range(i32 %a, i32* %P) { |
| switch i32 %a, label %sw.default [ |
| i32 0, label %sw.bb0 |
| i32 1000, label %sw.bb1 |
| i32 2000, label %sw.bb1 |
| i32 3000, label %sw.bb1 |
| i32 4000, label %sw.bb1 |
| i32 5000, label %sw.bb1 |
| i32 6000, label %sw.bb1 |
| i32 7000, label %sw.bb1 |
| i32 8000, label %sw.bb1 |
| i32 9000, label %sw.bb1 |
| ] |
| |
| sw.default: |
| store volatile i32 %a, i32* %P |
| br label %return |
| sw.bb0: |
| store volatile i32 %a, i32* %P |
| br label %return |
| sw.bb1: |
| store volatile i32 %a, i32* %P |
| br label %return |
| return: |
| ret i32 42 |
| } |
| |
| define i32 @caller_range(i32 %a, i32* %P) { |
| ; CHECK-LABEL: @caller_range( |
| ; CHECK: call i32 @callee_range |
| %r = call i32 @callee_range(i32 %a, i32* %P) |
| ret i32 %r |
| } |
| |
| define i32 @callee_bittest(i32 %a, i32* %P) { |
| switch i32 %a, label %sw.default [ |
| i32 0, label %sw.bb0 |
| i32 1, label %sw.bb1 |
| i32 2, label %sw.bb2 |
| i32 3, label %sw.bb0 |
| i32 4, label %sw.bb1 |
| i32 5, label %sw.bb2 |
| i32 6, label %sw.bb0 |
| i32 7, label %sw.bb1 |
| i32 8, label %sw.bb2 |
| ] |
| |
| sw.default: |
| store volatile i32 %a, i32* %P |
| br label %return |
| |
| sw.bb0: |
| store volatile i32 %a, i32* %P |
| br label %return |
| |
| sw.bb1: |
| store volatile i32 %a, i32* %P |
| br label %return |
| |
| sw.bb2: |
| br label %return |
| |
| return: |
| ret i32 42 |
| } |
| |
| |
| define i32 @caller_bittest(i32 %a, i32* %P) { |
| ; CHECK-LABEL: @caller_bittest( |
| ; CHECK-NOT: call i32 @callee_bittest |
| %r= call i32 @callee_bittest(i32 %a, i32* %P) |
| ret i32 %r |
| } |
| |
| define i32 @callee_jumptable(i32 %a, i32* %P) { |
| switch i32 %a, label %sw.default [ |
| i32 1001, label %sw.bb101 |
| i32 1002, label %sw.bb102 |
| i32 1003, label %sw.bb103 |
| i32 1004, label %sw.bb104 |
| i32 1005, label %sw.bb101 |
| i32 1006, label %sw.bb102 |
| i32 1007, label %sw.bb103 |
| i32 1008, label %sw.bb104 |
| i32 1009, label %sw.bb101 |
| i32 1010, label %sw.bb102 |
| i32 1011, label %sw.bb103 |
| i32 1012, label %sw.bb104 |
| ] |
| |
| sw.default: |
| br label %return |
| |
| sw.bb101: |
| store volatile i32 %a, i32* %P |
| br label %return |
| |
| sw.bb102: |
| store volatile i32 %a, i32* %P |
| br label %return |
| |
| sw.bb103: |
| store volatile i32 %a, i32* %P |
| br label %return |
| |
| sw.bb104: |
| store volatile i32 %a, i32* %P |
| br label %return |
| |
| return: |
| ret i32 42 |
| } |
| |
| define i32 @caller_jumptable(i32 %a, i32 %b, i32* %P) { |
| ; CHECK-LABEL: @caller_jumptable( |
| ; CHECK: call i32 @callee_jumptable |
| %r = call i32 @callee_jumptable(i32 %b, i32* %P) |
| ret i32 %r |
| } |
| |
| |
| define internal i32 @callee_negativeCost(i32 %t) { |
| entry: |
| switch i32 %t, label %sw.default [ |
| i32 1, label %sw.bb |
| i32 0, label %sw.bb1 |
| i32 42, label %sw.bb2 |
| i32 43, label %sw.bb3 |
| ] |
| |
| sw.bb: ; preds = %entry |
| br label %cleanup |
| |
| sw.bb1: ; preds = %entry |
| br label %cleanup |
| |
| sw.bb2: ; preds = %entry |
| br label %cleanup |
| |
| sw.bb3: ; preds = %entry |
| br label %cleanup |
| |
| sw.default: ; preds = %entry |
| br label %cleanup |
| |
| cleanup: ; preds = %sw.default, %sw.bb3, %sw.bb2, %sw.bb1, %sw.bb |
| %retval.0 = phi i32 [ 1, %sw.default ], [ 3, %sw.bb3 ], [ 2, %sw.bb2 ], [ 0, %sw.bb1 ], [ 0, %sw.bb ] |
| ret i32 %retval.0 |
| } |
| |
| define i32 @caller_negativeCost(i32 %t) { |
| ; CHECK-LABEL: @caller_negativeCost( |
| ; CHECK-NOT: call i32 @callee_negativeCost |
| entry: |
| %call = call i32 @callee_negativeCost(i32 %t) |
| ret i32 %call |
| } |