mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
67ae135759
Similarly inlining of the function is inhibited, if that would duplicate the call (in particular inlining is still allowed when there is only one callsite and the function has internal linkage). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170704 91177308-0d34-0410-b5e6-96231b3b80d8
93 lines
1.6 KiB
LLVM
93 lines
1.6 KiB
LLVM
; RUN: opt < %s -inline -scalarrepl -S | FileCheck %s
|
|
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
|
|
|
|
define i32 @test1f(i32 %i) {
|
|
ret i32 %i
|
|
}
|
|
|
|
define i32 @test1(i32 %W) {
|
|
%X = call i32 @test1f(i32 7)
|
|
%Y = add i32 %X, %W
|
|
ret i32 %Y
|
|
; CHECK: @test1(
|
|
; CHECK-NEXT: %Y = add i32 7, %W
|
|
; CHECK-NEXT: ret i32 %Y
|
|
}
|
|
|
|
|
|
|
|
; rdar://7339069
|
|
|
|
%T = type { i32, i32 }
|
|
|
|
; CHECK-NOT: @test2f
|
|
define internal %T* @test2f(i1 %cond, %T* %P) {
|
|
br i1 %cond, label %T, label %F
|
|
|
|
T:
|
|
%A = getelementptr %T* %P, i32 0, i32 0
|
|
store i32 42, i32* %A
|
|
ret %T* %P
|
|
|
|
F:
|
|
ret %T* %P
|
|
}
|
|
|
|
define i32 @test2(i1 %cond) {
|
|
%A = alloca %T
|
|
|
|
%B = call %T* @test2f(i1 %cond, %T* %A)
|
|
%C = getelementptr %T* %B, i32 0, i32 0
|
|
%D = load i32* %C
|
|
ret i32 %D
|
|
|
|
; CHECK: @test2(
|
|
; CHECK-NOT: = alloca
|
|
; CHECK: ret i32
|
|
}
|
|
|
|
declare void @barrier() noduplicate
|
|
|
|
define internal i32 @f() {
|
|
call void @barrier() noduplicate
|
|
ret i32 1
|
|
}
|
|
|
|
define i32 @g() {
|
|
call void @barrier() noduplicate
|
|
ret i32 2
|
|
}
|
|
|
|
define internal i32 @h() {
|
|
call void @barrier() noduplicate
|
|
ret i32 3
|
|
}
|
|
|
|
define i32 @test3() {
|
|
%b = call i32 @f()
|
|
ret i32 %b
|
|
}
|
|
|
|
; The call to @f cannot be inlined as there is another callsite
|
|
; calling @f, and @f contains a noduplicate call.
|
|
;
|
|
; The call to @g cannot be inlined as it has external linkage.
|
|
;
|
|
; The call to @h *can* be inlined.
|
|
|
|
; CHECK: @test
|
|
define i32 @test() {
|
|
; CHECK: call i32 @f()
|
|
%a = call i32 @f()
|
|
; CHECK: call i32 @g()
|
|
%b = call i32 @g()
|
|
; CHECK-NOT: call i32 @h()
|
|
%c = call i32 @h()
|
|
|
|
%d = add i32 %a, %b
|
|
%e = add i32 %d, %c
|
|
|
|
ret i32 %e
|
|
; CHECK: }
|
|
}
|