Musttail calls require extra handling to properly propagate the calling convention information and tail call information. The outliner does not currently do this, so we ignore call instructions that utilize the swifttailcc and tailcc calling convention as well as functions marked with the attribute musttail. Reviewers: paquette, aschwaighofer Differential Revision: https://reviews.llvm.org/D120733
35 lines
944 B
LLVM
35 lines
944 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs
|
|
; RUN: opt -S -verify -iroutliner -ir-outlining-no-cost < %s | FileCheck %s
|
|
|
|
; Check that we do not outline musttail when swifttaill cc or tailcc
|
|
; is not present.
|
|
|
|
declare void @musttail()
|
|
|
|
define void @f1() {
|
|
%a = alloca i32, align 4
|
|
store i32 2, i32* %a, align 4
|
|
musttail call void @musttail()
|
|
ret void
|
|
}
|
|
|
|
define void @f2() {
|
|
%a = alloca i32, align 4
|
|
store i32 2, i32* %a, align 4
|
|
musttail call void @musttail()
|
|
ret void
|
|
}
|
|
; CHECK-LABEL: @f1(
|
|
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
|
|
; CHECK-NEXT: store i32 2, i32* [[A]], align 4
|
|
; CHECK-NEXT: musttail call void @musttail()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
;
|
|
; CHECK-LABEL: @f2(
|
|
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
|
|
; CHECK-NEXT: store i32 2, i32* [[A]], align 4
|
|
; CHECK-NEXT: musttail call void @musttail()
|
|
; CHECK-NEXT: ret void
|
|
;
|