blob: ab9aff7dbd90fbbc6143bcc3ec44e1da025e3498 [file] [edit]
; 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
}