| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -S -passes='ipsccp<func-spec>' -force-specialization < %s | FileCheck %s |
| |
| ; Interposable functions (e.g. with weak linkage), cannot be specialized, as |
| ; we don't know whether the definition we see is the prevailing definition. |
| |
| ; Inexact definitions (e.g. with linkonce_odr linkage) *can* be specialized. |
| |
| define weak i32 @weak_callee(i32 %x, i32 %y) { |
| ; CHECK-LABEL: define weak i32 @weak_callee( |
| ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { |
| ; CHECK-NEXT: [[R2:%.*]] = add i32 [[X]], [[Y]] |
| ; CHECK-NEXT: ret i32 [[R2]] |
| ; |
| %r2 = add i32 %x, %y |
| ret i32 %r2 |
| } |
| |
| define linkonce_odr i32 @linkonce_odr_callee(i32 %x, i32 %y) { |
| ; CHECK-LABEL: define linkonce_odr i32 @linkonce_odr_callee( |
| ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { |
| ; CHECK-NEXT: [[R2:%.*]] = add i32 [[X]], [[Y]] |
| ; CHECK-NEXT: ret i32 [[R2]] |
| ; |
| %r2 = add i32 %x, %y |
| ret i32 %r2 |
| } |
| |
| define i32 @test() { |
| ; CHECK-LABEL: define i32 @test() { |
| ; CHECK-NEXT: [[R1:%.*]] = call i32 @weak_callee(i32 1, i32 2) |
| ; CHECK-NEXT: [[R2:%.*]] = call i32 @linkonce_odr_callee.specialized.1(i32 1, i32 2) |
| ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[R1]], 3 |
| ; CHECK-NEXT: ret i32 [[ADD]] |
| ; |
| %r1 = call i32 @weak_callee(i32 1, i32 2) |
| %r2 = call i32 @linkonce_odr_callee(i32 1, i32 2) |
| %add = add i32 %r1, %r2 |
| ret i32 %add |
| } |