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