You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.167
Former-commit-id: 289509151e0fee68a1b591a20c9f109c3c789d3a
This commit is contained in:
parent
e19d552987
commit
b084638f15
@ -1,19 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
|
||||
; CHECK: define internal i32 @deref(i32 %x.val) #0 {
|
||||
define internal i32 @deref(i32* %x) nounwind {
|
||||
entry:
|
||||
%tmp2 = load i32, i32* %x, align 4
|
||||
ret i32 %tmp2
|
||||
}
|
||||
|
||||
define i32 @f(i32 %x) {
|
||||
entry:
|
||||
%x_addr = alloca i32
|
||||
store i32 %x, i32* %x_addr, align 4
|
||||
; CHECK: %tmp1 = call i32 @deref(i32 %x_addr.val) [[NUW:#[0-9]+]]
|
||||
%tmp1 = call i32 @deref( i32* %x_addr ) nounwind
|
||||
ret i32 %tmp1
|
||||
}
|
||||
|
||||
; CHECK: attributes [[NUW]] = { nounwind }
|
@ -1,30 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; PR2498
|
||||
|
||||
; This test tries to convince argpromotion about promoting the load from %A + 2,
|
||||
; because there is a load of %A in the entry block
|
||||
define internal i32 @callee(i1 %C, i32* %A) {
|
||||
; CHECK-LABEL: define internal i32 @callee(
|
||||
; CHECK: i1 %C, i32* %A)
|
||||
entry:
|
||||
; Unconditonally load the element at %A
|
||||
%A.0 = load i32, i32* %A
|
||||
br i1 %C, label %T, label %F
|
||||
|
||||
T:
|
||||
ret i32 %A.0
|
||||
|
||||
F:
|
||||
; Load the element at offset two from %A. This should not be promoted!
|
||||
%A.2 = getelementptr i32, i32* %A, i32 2
|
||||
%R = load i32, i32* %A.2
|
||||
ret i32 %R
|
||||
}
|
||||
|
||||
define i32 @foo() {
|
||||
; CHECK-LABEL: define i32 @foo
|
||||
%X = call i32 @callee(i1 false, i32* null) ; <i32> [#uses=1]
|
||||
; CHECK: call i32 @callee(i1 false, i32* null)
|
||||
ret i32 %X
|
||||
}
|
||||
|
@ -1,12 +0,0 @@
|
||||
; RUN: opt < %s -inline -argpromotion -disable-output
|
||||
|
||||
define internal fastcc i32 @hash(i32* %ts, i32 %mod) nounwind {
|
||||
entry:
|
||||
unreachable
|
||||
}
|
||||
|
||||
define void @encode(i32* %m, i32* %ts, i32* %new) nounwind {
|
||||
entry:
|
||||
%0 = call fastcc i32 @hash( i32* %ts, i32 0 ) nounwind ; <i32> [#uses=0]
|
||||
unreachable
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -disable-output
|
||||
|
||||
define internal fastcc i32 @term_SharingList(i32* %Term, i32* %List) nounwind {
|
||||
entry:
|
||||
br i1 false, label %bb, label %bb5
|
||||
|
||||
bb: ; preds = %entry
|
||||
%0 = call fastcc i32 @term_SharingList( i32* null, i32* %List ) nounwind ; <i32> [#uses=0]
|
||||
unreachable
|
||||
|
||||
bb5: ; preds = %entry
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
define i32 @term_Sharing(i32* %Term) nounwind {
|
||||
entry:
|
||||
br i1 false, label %bb.i, label %bb14
|
||||
|
||||
bb.i: ; preds = %entry
|
||||
%0 = call fastcc i32 @term_SharingList( i32* null, i32* null ) nounwind ; <i32> [#uses=0]
|
||||
ret i32 1
|
||||
|
||||
bb14: ; preds = %entry
|
||||
ret i32 0
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
|
||||
|
||||
%T = type { i32, i32, i32, i32 }
|
||||
@G = constant %T { i32 0, i32 0, i32 17, i32 25 }
|
||||
|
||||
define internal i32 @test(%T* %p) {
|
||||
; CHECK-LABEL: define internal i32 @test(
|
||||
; CHECK: i32 %{{.*}}, i32 %{{.*}})
|
||||
entry:
|
||||
%a.gep = getelementptr %T, %T* %p, i64 0, i32 3
|
||||
%b.gep = getelementptr %T, %T* %p, i64 0, i32 2
|
||||
%a = load i32, i32* %a.gep
|
||||
%b = load i32, i32* %b.gep
|
||||
; CHECK-NOT: load
|
||||
%v = add i32 %a, %b
|
||||
ret i32 %v
|
||||
; CHECK: ret i32
|
||||
}
|
||||
|
||||
define i32 @caller() {
|
||||
; CHECK-LABEL: define i32 @caller(
|
||||
entry:
|
||||
%v = call i32 @test(%T* @G)
|
||||
; CHECK: %[[B_GEP:.*]] = getelementptr %T, %T* @G, i64 0, i32 2
|
||||
; CHECK: %[[B:.*]] = load i32, i32* %[[B_GEP]]
|
||||
; CHECK: %[[A_GEP:.*]] = getelementptr %T, %T* @G, i64 0, i32 3
|
||||
; CHECK: %[[A:.*]] = load i32, i32* %[[A_GEP]]
|
||||
; CHECK: call i32 @test(i32 %[[B]], i32 %[[A]])
|
||||
ret i32 %v
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
|
||||
|
||||
%struct.ss = type { i32, i64 }
|
||||
|
||||
; Don't drop 'byval' on %X here.
|
||||
define internal void @f(%struct.ss* byval %b, i32* byval %X, i32 %i) nounwind {
|
||||
; CHECK-LABEL: define internal void @f(
|
||||
; CHECK: i32 %[[B0:.*]], i64 %[[B1:.*]], i32* byval %X, i32 %i)
|
||||
entry:
|
||||
; CHECK: %[[B:.*]] = alloca %struct.ss
|
||||
; CHECK: %[[B_GEP0:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 0
|
||||
; CHECK: store i32 %[[B0]], i32* %[[B_GEP0]]
|
||||
; CHECK: %[[B_GEP1:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 1
|
||||
; CHECK: store i64 %[[B1]], i64* %[[B_GEP1]]
|
||||
|
||||
%tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
|
||||
; CHECK: %[[TMP:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 0
|
||||
%tmp1 = load i32, i32* %tmp, align 4
|
||||
; CHECK: %[[TMP1:.*]] = load i32, i32* %[[TMP]]
|
||||
%tmp2 = add i32 %tmp1, 1
|
||||
; CHECK: %[[TMP2:.*]] = add i32 %[[TMP1]], 1
|
||||
store i32 %tmp2, i32* %tmp, align 4
|
||||
; CHECK: store i32 %[[TMP2]], i32* %[[TMP]]
|
||||
|
||||
store i32 0, i32* %X
|
||||
; CHECK: store i32 0, i32* %X
|
||||
ret void
|
||||
}
|
||||
|
||||
; Also make sure we don't drop the call zeroext attribute.
|
||||
define i32 @test(i32* %X) {
|
||||
; CHECK-LABEL: define i32 @test(
|
||||
entry:
|
||||
%S = alloca %struct.ss
|
||||
; CHECK: %[[S:.*]] = alloca %struct.ss
|
||||
%tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
|
||||
store i32 1, i32* %tmp1, align 8
|
||||
; CHECK: store i32 1
|
||||
%tmp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
|
||||
store i64 2, i64* %tmp4, align 4
|
||||
; CHECK: store i64 2
|
||||
|
||||
call void @f( %struct.ss* byval %S, i32* byval %X, i32 zeroext 0)
|
||||
; CHECK: %[[S_GEP0:.*]] = getelementptr %struct.ss, %struct.ss* %[[S]], i32 0, i32 0
|
||||
; CHECK: %[[S0:.*]] = load i32, i32* %[[S_GEP0]]
|
||||
; CHECK: %[[S_GEP1:.*]] = getelementptr %struct.ss, %struct.ss* %[[S]], i32 0, i32 1
|
||||
; CHECK: %[[S1:.*]] = load i64, i64* %[[S_GEP1]]
|
||||
; CHECK: call void @f(i32 %[[S0]], i64 %[[S1]], i32* byval %X, i32 zeroext 0)
|
||||
|
||||
ret i32 0
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
; RUN: opt < %s -basicaa -argpromotion -mem2reg -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 internal i32 @test(i32* %X, i32* %Y) {
|
||||
; CHECK-LABEL: define internal i32 @test(i32 %X.val, i32 %Y.val)
|
||||
%A = load i32, i32* %X
|
||||
%B = load i32, i32* %Y
|
||||
%C = add i32 %A, %B
|
||||
ret i32 %C
|
||||
}
|
||||
|
||||
define internal i32 @caller(i32* %B) {
|
||||
; CHECK-LABEL: define internal i32 @caller(i32 %B.val1)
|
||||
%A = alloca i32
|
||||
store i32 1, i32* %A
|
||||
%C = call i32 @test(i32* %A, i32* %B)
|
||||
; CHECK: call i32 @test(i32 1, i32 %B.val1)
|
||||
ret i32 %C
|
||||
}
|
||||
|
||||
define i32 @callercaller() {
|
||||
; CHECK-LABEL: define i32 @callercaller()
|
||||
%B = alloca i32
|
||||
store i32 2, i32* %B
|
||||
%X = call i32 @caller(i32* %B)
|
||||
; CHECK: call i32 @caller(i32 2)
|
||||
ret i32 %X
|
||||
}
|
||||
|
@ -1,32 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
|
||||
|
||||
; Arg promotion eliminates the struct argument.
|
||||
; FIXME: Should it eliminate the i32* argument?
|
||||
|
||||
%struct.ss = type { i32, i64 }
|
||||
|
||||
define internal void @f(%struct.ss* byval %b, i32* byval %X) nounwind {
|
||||
; CHECK-LABEL: define internal void @f(i32 %b.0, i64 %b.1, i32* byval %X)
|
||||
entry:
|
||||
%tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
|
||||
%tmp1 = load i32, i32* %tmp, align 4
|
||||
%tmp2 = add i32 %tmp1, 1
|
||||
store i32 %tmp2, i32* %tmp, align 4
|
||||
|
||||
store i32 0, i32* %X
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @test(i32* %X) {
|
||||
; CHECK-LABEL: define i32 @test
|
||||
entry:
|
||||
%S = alloca %struct.ss
|
||||
%tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
|
||||
store i32 1, i32* %tmp1, align 8
|
||||
%tmp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
|
||||
store i64 2, i64* %tmp4, align 4
|
||||
call void @f( %struct.ss* byval %S, i32* byval %X)
|
||||
; CHECK: call void @f(i32 %{{.*}}, i64 %{{.*}}, i32* byval %{{.*}})
|
||||
ret i32 0
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -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"
|
||||
|
||||
%struct.ss = type { i32, i64 }
|
||||
|
||||
define internal void @f(%struct.ss* byval %b) nounwind {
|
||||
entry:
|
||||
%tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
|
||||
%tmp1 = load i32, i32* %tmp, align 4
|
||||
%tmp2 = add i32 %tmp1, 1
|
||||
store i32 %tmp2, i32* %tmp, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define internal void @f(i32 %b.0, i64 %b.1)
|
||||
; CHECK: alloca %struct.ss{{$}}
|
||||
; CHECK: store i32 %b.0
|
||||
; CHECK: store i64 %b.1
|
||||
|
||||
define internal void @g(%struct.ss* byval align 32 %b) nounwind {
|
||||
entry:
|
||||
%tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
|
||||
%tmp1 = load i32, i32* %tmp, align 4
|
||||
%tmp2 = add i32 %tmp1, 1
|
||||
store i32 %tmp2, i32* %tmp, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define internal void @g(i32 %b.0, i64 %b.1)
|
||||
; CHECK: alloca %struct.ss, align 32
|
||||
; CHECK: store i32 %b.0
|
||||
; CHECK: store i64 %b.1
|
||||
|
||||
define i32 @main() nounwind {
|
||||
entry:
|
||||
%S = alloca %struct.ss
|
||||
%tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
|
||||
store i32 1, i32* %tmp1, align 8
|
||||
%tmp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
|
||||
store i64 2, i64* %tmp4, align 4
|
||||
call void @f(%struct.ss* byval %S) nounwind
|
||||
call void @g(%struct.ss* byval %S) nounwind
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define i32 @main
|
||||
; CHECK: call void @f(i32 %{{.*}}, i64 %{{.*}})
|
||||
; CHECK: call void @g(i32 %{{.*}}, i64 %{{.*}})
|
@ -1,27 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
|
||||
|
||||
@G1 = constant i32 0
|
||||
@G2 = constant i32* @G1
|
||||
|
||||
define internal i32 @test(i32** %x) {
|
||||
; CHECK-LABEL: define internal i32 @test(
|
||||
; CHECK: i32 %{{.*}})
|
||||
entry:
|
||||
%y = load i32*, i32** %x
|
||||
%z = load i32, i32* %y
|
||||
; CHECK-NOT: load
|
||||
ret i32 %z
|
||||
; CHECK: ret i32
|
||||
}
|
||||
|
||||
define i32 @caller() {
|
||||
; CHECK-LABEL: define i32 @caller()
|
||||
entry:
|
||||
%x = call i32 @test(i32** @G2)
|
||||
; CHECK: %[[Y:.*]] = load i32*, i32** @G2
|
||||
; CHECK: %[[Z:.*]] = load i32, i32* %[[Y]]
|
||||
; CHECK: call i32 @test(i32 %[[Z]])
|
||||
ret i32 %x
|
||||
}
|
||||
|
@ -1,27 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
|
||||
|
||||
; Don't promote around control flow.
|
||||
define internal i32 @callee(i1 %C, i32* %P) {
|
||||
; CHECK-LABEL: define internal i32 @callee(
|
||||
; CHECK: i1 %C, i32* %P)
|
||||
entry:
|
||||
br i1 %C, label %T, label %F
|
||||
|
||||
T:
|
||||
ret i32 17
|
||||
|
||||
F:
|
||||
%X = load i32, i32* %P
|
||||
ret i32 %X
|
||||
}
|
||||
|
||||
define i32 @foo() {
|
||||
; CHECK-LABEL: define i32 @foo(
|
||||
entry:
|
||||
; CHECK-NOT: load i32, i32* null
|
||||
%X = call i32 @callee(i1 true, i32* null)
|
||||
; CHECK: call i32 @callee(i1 true, i32* null)
|
||||
ret i32 %X
|
||||
}
|
||||
|
@ -1,24 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
|
||||
|
||||
; CHECK: load i32, i32* %A
|
||||
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 internal i32 @callee(i1 %C, i32* %P) {
|
||||
br i1 %C, label %T, label %F
|
||||
|
||||
T: ; preds = %0
|
||||
ret i32 17
|
||||
|
||||
F: ; preds = %0
|
||||
%X = load i32, i32* %P ; <i32> [#uses=1]
|
||||
ret i32 %X
|
||||
}
|
||||
|
||||
define i32 @foo() {
|
||||
%A = alloca i32 ; <i32*> [#uses=2]
|
||||
store i32 17, i32* %A
|
||||
%X = call i32 @callee( i1 false, i32* %A ) ; <i32> [#uses=1]
|
||||
ret i32 %X
|
||||
}
|
||||
|
@ -1,73 +0,0 @@
|
||||
; RUN: opt -S < %s -inline -argpromotion | FileCheck %s
|
||||
; RUN: opt -S < %s -passes=inline,argpromotion | FileCheck %s
|
||||
|
||||
%S = type { %S* }
|
||||
|
||||
; Inlining should nuke the invoke (and any inlined calls) here even with
|
||||
; argument promotion running along with it.
|
||||
define void @zot() personality i32 (...)* @wibble {
|
||||
; CHECK-LABEL: define void @zot() personality i32 (...)* @wibble
|
||||
; CHECK-NOT: call
|
||||
; CHECK-NOT: invoke
|
||||
bb:
|
||||
invoke void @hoge()
|
||||
to label %bb1 unwind label %bb2
|
||||
|
||||
bb1:
|
||||
unreachable
|
||||
|
||||
bb2:
|
||||
%tmp = landingpad { i8*, i32 }
|
||||
cleanup
|
||||
unreachable
|
||||
}
|
||||
|
||||
define internal void @hoge() {
|
||||
bb:
|
||||
%tmp = call fastcc i8* @spam(i1 (i8*)* @eggs)
|
||||
%tmp1 = call fastcc i8* @spam(i1 (i8*)* @barney)
|
||||
unreachable
|
||||
}
|
||||
|
||||
define internal fastcc i8* @spam(i1 (i8*)* %arg) {
|
||||
bb:
|
||||
unreachable
|
||||
}
|
||||
|
||||
define internal i1 @eggs(i8* %arg) {
|
||||
bb:
|
||||
%tmp = call zeroext i1 @barney(i8* %arg)
|
||||
unreachable
|
||||
}
|
||||
|
||||
define internal i1 @barney(i8* %arg) {
|
||||
bb:
|
||||
ret i1 undef
|
||||
}
|
||||
|
||||
define i32 @test_inf_promote_caller(i32 %arg) {
|
||||
; CHECK-LABEL: define i32 @test_inf_promote_caller(
|
||||
bb:
|
||||
%tmp = alloca %S
|
||||
%tmp1 = alloca %S
|
||||
%tmp2 = call i32 @test_inf_promote_callee(%S* %tmp, %S* %tmp1)
|
||||
; CHECK: call i32 @test_inf_promote_callee(%S* %{{.*}}, %S* %{{.*}})
|
||||
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
define internal i32 @test_inf_promote_callee(%S* %arg, %S* %arg1) {
|
||||
; CHECK-LABEL: define internal i32 @test_inf_promote_callee(
|
||||
; CHECK: %S* %{{.*}}, %S* %{{.*}})
|
||||
bb:
|
||||
%tmp = getelementptr %S, %S* %arg1, i32 0, i32 0
|
||||
%tmp2 = load %S*, %S** %tmp
|
||||
%tmp3 = getelementptr %S, %S* %arg, i32 0, i32 0
|
||||
%tmp4 = load %S*, %S** %tmp3
|
||||
%tmp5 = call i32 @test_inf_promote_callee(%S* %tmp4, %S* %tmp2)
|
||||
; CHECK: call i32 @test_inf_promote_callee(%S* %{{.*}}, %S* %{{.*}})
|
||||
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @wibble(...)
|
@ -1,29 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
|
||||
|
||||
declare void @sink(i32)
|
||||
|
||||
; CHECK: define internal void @test({{.*}} !dbg [[SP:![0-9]+]]
|
||||
define internal void @test(i32** %X) !dbg !2 {
|
||||
%1 = load i32*, i32** %X, align 8
|
||||
%2 = load i32, i32* %1, align 8
|
||||
call void @sink(i32 %2)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @caller(i32** %Y) {
|
||||
; CHECK: call void @test(i32 %
|
||||
call void @test(i32** %Y)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: [[SP]] = distinct !DISubprogram(name: "test",
|
||||
|
||||
!llvm.module.flags = !{!0}
|
||||
!llvm.dbg.cu = !{!3}
|
||||
|
||||
!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!1 = !DILocation(line: 8, scope: !2)
|
||||
!2 = distinct !DISubprogram(name: "test", file: !5, line: 3, isLocal: true, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !3, scopeLine: 3, scope: null)
|
||||
!3 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: LineTablesOnly, file: !5)
|
||||
!5 = !DIFile(filename: "test.c", directory: "")
|
@ -1,59 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
%union.u = type { x86_fp80 }
|
||||
%struct.s = type { double, i16, i8, [5 x i8] }
|
||||
|
||||
@b = internal global %struct.s { double 3.14, i16 9439, i8 25, [5 x i8] undef }, align 16
|
||||
|
||||
%struct.Foo = type { i32, i64 }
|
||||
@a = internal global %struct.Foo { i32 1, i64 2 }, align 8
|
||||
|
||||
define void @run() {
|
||||
entry:
|
||||
tail call i8 @UseLongDoubleUnsafely(%union.u* byval align 16 bitcast (%struct.s* @b to %union.u*))
|
||||
tail call x86_fp80 @UseLongDoubleSafely(%union.u* byval align 16 bitcast (%struct.s* @b to %union.u*))
|
||||
call i64 @AccessPaddingOfStruct(%struct.Foo* @a)
|
||||
call i64 @CaptureAStruct(%struct.Foo* @a)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: internal i8 @UseLongDoubleUnsafely(%union.u* byval align 16 %arg) {
|
||||
define internal i8 @UseLongDoubleUnsafely(%union.u* byval align 16 %arg) {
|
||||
entry:
|
||||
%bitcast = bitcast %union.u* %arg to %struct.s*
|
||||
%gep = getelementptr inbounds %struct.s, %struct.s* %bitcast, i64 0, i32 2
|
||||
%result = load i8, i8* %gep
|
||||
ret i8 %result
|
||||
}
|
||||
|
||||
; CHECK: internal x86_fp80 @UseLongDoubleSafely(x86_fp80 {{%.*}}) {
|
||||
define internal x86_fp80 @UseLongDoubleSafely(%union.u* byval align 16 %arg) {
|
||||
%gep = getelementptr inbounds %union.u, %union.u* %arg, i64 0, i32 0
|
||||
%fp80 = load x86_fp80, x86_fp80* %gep
|
||||
ret x86_fp80 %fp80
|
||||
}
|
||||
|
||||
; CHECK: define internal i64 @AccessPaddingOfStruct(%struct.Foo* byval %a) {
|
||||
define internal i64 @AccessPaddingOfStruct(%struct.Foo* byval %a) {
|
||||
%p = bitcast %struct.Foo* %a to i64*
|
||||
%v = load i64, i64* %p
|
||||
ret i64 %v
|
||||
}
|
||||
|
||||
; CHECK: define internal i64 @CaptureAStruct(%struct.Foo* byval %a) {
|
||||
define internal i64 @CaptureAStruct(%struct.Foo* byval %a) {
|
||||
entry:
|
||||
%a_ptr = alloca %struct.Foo*
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
%phi = phi %struct.Foo* [ null, %entry ], [ %gep, %loop ]
|
||||
%0 = phi %struct.Foo* [ %a, %entry ], [ %0, %loop ]
|
||||
store %struct.Foo* %phi, %struct.Foo** %a_ptr
|
||||
%gep = getelementptr %struct.Foo, %struct.Foo* %a, i64 0
|
||||
br label %loop
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
; RUN: opt %s -argpromotion -sroa -S | FileCheck %s
|
||||
; RUN: opt %s -passes='argpromotion,function(sroa)' -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"
|
||||
|
||||
%struct.ss = type { i32, i32 }
|
||||
|
||||
; Argpromote + sroa should change this to passing the two integers by value.
|
||||
define internal i32 @f(%struct.ss* inalloca %s) {
|
||||
entry:
|
||||
%f0 = getelementptr %struct.ss, %struct.ss* %s, i32 0, i32 0
|
||||
%f1 = getelementptr %struct.ss, %struct.ss* %s, i32 0, i32 1
|
||||
%a = load i32, i32* %f0, align 4
|
||||
%b = load i32, i32* %f1, align 4
|
||||
%r = add i32 %a, %b
|
||||
ret i32 %r
|
||||
}
|
||||
; CHECK-LABEL: define internal i32 @f
|
||||
; CHECK-NOT: load
|
||||
; CHECK: ret
|
||||
|
||||
define i32 @main() {
|
||||
entry:
|
||||
%S = alloca inalloca %struct.ss
|
||||
%f0 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
|
||||
%f1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
|
||||
store i32 1, i32* %f0, align 4
|
||||
store i32 2, i32* %f1, align 4
|
||||
%r = call i32 @f(%struct.ss* inalloca %S)
|
||||
ret i32 %r
|
||||
}
|
||||
; CHECK-LABEL: define i32 @main
|
||||
; CHECK-NOT: load
|
||||
; CHECK: ret
|
||||
|
||||
; Argpromote can't promote %a because of the icmp use.
|
||||
define internal i1 @g(%struct.ss* %a, %struct.ss* inalloca %b) nounwind {
|
||||
; CHECK: define internal i1 @g(%struct.ss* %a, %struct.ss* inalloca %b)
|
||||
entry:
|
||||
%c = icmp eq %struct.ss* %a, %b
|
||||
ret i1 %c
|
||||
}
|
||||
|
||||
define i32 @test() {
|
||||
entry:
|
||||
%S = alloca inalloca %struct.ss
|
||||
%c = call i1 @g(%struct.ss* %S, %struct.ss* inalloca %S)
|
||||
; CHECK: call i1 @g(%struct.ss* %S, %struct.ss* inalloca %S)
|
||||
ret i32 0
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; PR36543
|
||||
|
||||
; Don't promote arguments of musttail callee
|
||||
|
||||
%T = type { i32, i32, i32, i32 }
|
||||
|
||||
; CHECK-LABEL: define internal i32 @test(%T* %p)
|
||||
define internal i32 @test(%T* %p) {
|
||||
%a.gep = getelementptr %T, %T* %p, i64 0, i32 3
|
||||
%b.gep = getelementptr %T, %T* %p, i64 0, i32 2
|
||||
%a = load i32, i32* %a.gep
|
||||
%b = load i32, i32* %b.gep
|
||||
%v = add i32 %a, %b
|
||||
ret i32 %v
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define i32 @caller(%T* %p)
|
||||
define i32 @caller(%T* %p) {
|
||||
%v = musttail call i32 @test(%T* %p)
|
||||
ret i32 %v
|
||||
}
|
||||
|
||||
; Don't promote arguments of musttail caller
|
||||
|
||||
define i32 @foo(%T* %p, i32 %v) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define internal i32 @test2(%T* %p, i32 %p2)
|
||||
define internal i32 @test2(%T* %p, i32 %p2) {
|
||||
%a.gep = getelementptr %T, %T* %p, i64 0, i32 3
|
||||
%b.gep = getelementptr %T, %T* %p, i64 0, i32 2
|
||||
%a = load i32, i32* %a.gep
|
||||
%b = load i32, i32* %b.gep
|
||||
%v = add i32 %a, %b
|
||||
%ca = musttail call i32 @foo(%T* undef, i32 %v)
|
||||
ret i32 %ca
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define i32 @caller2(%T* %g)
|
||||
define i32 @caller2(%T* %g) {
|
||||
%v = call i32 @test2(%T* %g, i32 0)
|
||||
ret i32 %v
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
; RUN: opt -S -argpromotion < %s | FileCheck %s
|
||||
; RUN: opt -S -passes=argpromotion < %s | FileCheck %s
|
||||
target triple = "x86_64-pc-windows-msvc"
|
||||
|
||||
define internal void @callee(i8*) {
|
||||
entry:
|
||||
call void @thunk()
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test1() personality i32 (...)* @__CxxFrameHandler3 {
|
||||
entry:
|
||||
invoke void @thunk()
|
||||
to label %out unwind label %cpad
|
||||
|
||||
out:
|
||||
ret void
|
||||
|
||||
cpad:
|
||||
%pad = cleanuppad within none []
|
||||
call void @callee(i8* null) [ "funclet"(token %pad) ]
|
||||
cleanupret from %pad unwind to caller
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @test1(
|
||||
; CHECK: %[[pad:.*]] = cleanuppad within none []
|
||||
; CHECK-NEXT: call void @callee() [ "funclet"(token %[[pad]]) ]
|
||||
; CHECK-NEXT: cleanupret from %[[pad]] unwind to caller
|
||||
|
||||
declare void @thunk()
|
||||
|
||||
declare i32 @__CxxFrameHandler3(...)
|
File diff suppressed because it is too large
Load Diff
@ -1,23 +0,0 @@
|
||||
; RUN: opt < %s -argpromotion -S | FileCheck %s
|
||||
; PR 32917
|
||||
|
||||
@b = common local_unnamed_addr global i32 0, align 4
|
||||
@a = common local_unnamed_addr global i32 0, align 4
|
||||
|
||||
define i32 @fn2() local_unnamed_addr {
|
||||
%1 = load i32, i32* @b, align 4
|
||||
%2 = sext i32 %1 to i64
|
||||
%3 = inttoptr i64 %2 to i32*
|
||||
call fastcc void @fn1(i32* %3)
|
||||
ret i32 undef
|
||||
}
|
||||
|
||||
define internal fastcc void @fn1(i32* nocapture readonly) unnamed_addr {
|
||||
%2 = getelementptr inbounds i32, i32* %0, i64 -1
|
||||
%3 = load i32, i32* %2, align 4
|
||||
store i32 %3, i32* @a, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: getelementptr {{.*}} -1
|
||||
; CHECK-NOT: getelementptr {{.*}} 4294967295
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user