| ; RUN: opt < %s -passes=inline -inline-threshold=100 -S | FileCheck %s |
| |
| ;; caller1/caller2/callee1/callee2 test functions with incompatible attributes |
| ;; won't be inlined into each other. |
| |
| define i32 @callee1(i32 %x) { |
| %x1 = add i32 %x, 1 |
| %x2 = add i32 %x1, 1 |
| %x3 = add i32 %x2, 1 |
| call void @extern() |
| ret i32 %x3 |
| } |
| |
| define i32 @callee2(i32 %x) #0 { |
| %x1 = add i32 %x, 1 |
| %x2 = add i32 %x1, 1 |
| %x3 = add i32 %x2, 1 |
| call void @extern() |
| ret i32 %x3 |
| } |
| |
| define i32 @caller1(i32 %y1) { |
| ;; caller1 doesn't have use-sample-profile attribute but callee2 has, |
| ;; so callee2 won't be inlined into caller1. |
| ;; caller1 and callee1 don't have use-sample-profile attribute, so |
| ;; callee1 can be inlined into caller1. |
| ; CHECK-LABEL: @caller1( |
| ; CHECK: call i32 @callee2 |
| ; CHECK-NOT: call i32 @callee1 |
| %y2 = call i32 @callee2(i32 %y1) |
| %y3 = call i32 @callee1(i32 %y2) |
| ret i32 %y3 |
| } |
| |
| define i32 @caller2(i32 %y1) #0 { |
| ;; caller2 and callee2 both have use-sample-profile attribute, so |
| ;; callee2 can be inlined into caller2. |
| ;; caller2 has use-sample-profile attribute but callee1 doesn't have, |
| ;; so callee1 won't be inlined into caller2. |
| ; CHECK-LABEL: @caller2( |
| ; CHECK-NOT: call i32 @callee2 |
| ; CHECK: call i32 @callee1 |
| %y2 = call i32 @callee2(i32 %y1) |
| %y3 = call i32 @callee1(i32 %y2) |
| ret i32 %y3 |
| } |
| |
| declare void @extern() |
| |
| attributes #0 = { "use-sample-profile" } |