Allow inlining only when the Callee has a subset of the Caller's features. In principle, we should be able to inline regardless of any features because WebAssembly supports features at module granularity, not function granularity, but without this restriction it would be possible for a module to "forget" about features if all the functions that used them were inlined. Requested in PR46812. Differential Revision: https://reviews.llvm.org/D85494
42 lines
1.1 KiB
LLVM
42 lines
1.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -mtriple=wasm32-unknown-unknown -S -inline | FileCheck %s
|
|
|
|
; Check that having functions can be inlined into callers only when
|
|
; they have a subset of the caller's features.
|
|
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
|
target triple = "wasm32-unknown-unknown"
|
|
|
|
declare void @foo()
|
|
|
|
define internal void @uses_simd() #0 {
|
|
; CHECK-LABEL: @uses_simd(
|
|
; CHECK-NEXT: tail call void @foo()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @foo()
|
|
ret void
|
|
}
|
|
|
|
define void @many_features() #1 {
|
|
; CHECK-LABEL: @many_features(
|
|
; CHECK-NEXT: tail call void @foo()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call fastcc void @uses_simd()
|
|
ret void
|
|
}
|
|
|
|
define void @few_features() #2 {
|
|
; CHECK-LABEL: @few_features(
|
|
; CHECK-NEXT: tail call fastcc void @uses_simd()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call fastcc void @uses_simd()
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { "target-cpu"="mvp" "target-features"="+simd128"}
|
|
attributes #1 = { "target-cpu"="bleeding-edge" "target-features"="+simd128" }
|
|
attributes #2 = { "target-cpu"="mvp" "target-features"="+multivalue" }
|