mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
c6df3d773b
Nearly all the changes to this pass have been done while maintaining and updating other parts of LLVM. LLVM has had another pass, SROA, which has superseded ScalarReplAggregates for quite some time. Differential Revision: http://reviews.llvm.org/D21316 llvm-svn: 272737
80 lines
4.1 KiB
LLVM
80 lines
4.1 KiB
LLVM
; RUN: opt -basicaa -inline -S -sroa -gvn -instcombine < %s | FileCheck %s
|
|
; PR5009
|
|
|
|
; CHECK: define i32 @main()
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: call void @exit(i32 38)
|
|
|
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
|
target triple = "x86_64-apple-darwin10.0.0"
|
|
|
|
%struct.cont_t = type { void (i8*, i32)*, i8* }
|
|
%struct.foo_sf_t = type { %struct.cont_t*, i32 }
|
|
|
|
define i32 @main() nounwind ssp {
|
|
entry:
|
|
%cont = alloca %struct.cont_t, align 8 ; <%struct.cont_t*> [#uses=4]
|
|
%tmp = getelementptr inbounds %struct.cont_t, %struct.cont_t* %cont, i32 0, i32 0 ; <void (i8*, i32)**> [#uses=1]
|
|
%tmp1 = getelementptr inbounds %struct.cont_t, %struct.cont_t* %cont, i32 0, i32 0 ; <void (i8*, i32)**> [#uses=2]
|
|
store void (i8*, i32)* bitcast (void (%struct.cont_t*, i32)* @quit to void (i8*, i32)*), void (i8*, i32)** %tmp1
|
|
%tmp2 = load void (i8*, i32)*, void (i8*, i32)** %tmp1 ; <void (i8*, i32)*> [#uses=1]
|
|
store void (i8*, i32)* %tmp2, void (i8*, i32)** %tmp
|
|
%tmp3 = getelementptr inbounds %struct.cont_t, %struct.cont_t* %cont, i32 0, i32 1 ; <i8**> [#uses=1]
|
|
store i8* null, i8** %tmp3
|
|
call void @foo(%struct.cont_t* %cont)
|
|
ret i32 0
|
|
}
|
|
|
|
define internal void @quit(%struct.cont_t* %cont, i32 %rcode) nounwind ssp {
|
|
entry:
|
|
call void @exit(i32 %rcode) noreturn
|
|
unreachable
|
|
}
|
|
|
|
define internal void @foo(%struct.cont_t* %c) nounwind ssp {
|
|
entry:
|
|
%sf = alloca %struct.foo_sf_t, align 8 ; <%struct.foo_sf_t*> [#uses=3]
|
|
%next = alloca %struct.cont_t, align 8 ; <%struct.cont_t*> [#uses=3]
|
|
%tmp = getelementptr inbounds %struct.foo_sf_t, %struct.foo_sf_t* %sf, i32 0, i32 0 ; <%struct.cont_t**> [#uses=1]
|
|
store %struct.cont_t* %c, %struct.cont_t** %tmp
|
|
%tmp2 = getelementptr inbounds %struct.foo_sf_t, %struct.foo_sf_t* %sf, i32 0, i32 1 ; <i32*> [#uses=1]
|
|
store i32 2, i32* %tmp2
|
|
%tmp4 = getelementptr inbounds %struct.cont_t, %struct.cont_t* %next, i32 0, i32 0 ; <void (i8*, i32)**> [#uses=1]
|
|
store void (i8*, i32)* bitcast (void (%struct.foo_sf_t*, i32)* @foo2 to void (i8*, i32)*), void (i8*, i32)** %tmp4
|
|
%tmp5 = getelementptr inbounds %struct.cont_t, %struct.cont_t* %next, i32 0, i32 1 ; <i8**> [#uses=1]
|
|
%conv = bitcast %struct.foo_sf_t* %sf to i8* ; <i8*> [#uses=1]
|
|
store i8* %conv, i8** %tmp5
|
|
call void @bar(%struct.cont_t* %next, i32 14)
|
|
ret void
|
|
}
|
|
|
|
define internal void @foo2(%struct.foo_sf_t* %sf, i32 %y) nounwind ssp {
|
|
entry:
|
|
%tmp1 = getelementptr inbounds %struct.foo_sf_t, %struct.foo_sf_t* %sf, i32 0, i32 0 ; <%struct.cont_t**> [#uses=1]
|
|
%tmp2 = load %struct.cont_t*, %struct.cont_t** %tmp1 ; <%struct.cont_t*> [#uses=1]
|
|
%tmp3 = getelementptr inbounds %struct.cont_t, %struct.cont_t* %tmp2, i32 0, i32 0 ; <void (i8*, i32)**> [#uses=1]
|
|
%tmp4 = load void (i8*, i32)*, void (i8*, i32)** %tmp3 ; <void (i8*, i32)*> [#uses=1]
|
|
%tmp6 = getelementptr inbounds %struct.foo_sf_t, %struct.foo_sf_t* %sf, i32 0, i32 0 ; <%struct.cont_t**> [#uses=1]
|
|
%tmp7 = load %struct.cont_t*, %struct.cont_t** %tmp6 ; <%struct.cont_t*> [#uses=1]
|
|
%conv = bitcast %struct.cont_t* %tmp7 to i8* ; <i8*> [#uses=1]
|
|
%tmp9 = getelementptr inbounds %struct.foo_sf_t, %struct.foo_sf_t* %sf, i32 0, i32 1 ; <i32*> [#uses=1]
|
|
%tmp10 = load i32, i32* %tmp9 ; <i32> [#uses=1]
|
|
%mul = mul i32 %tmp10, %y ; <i32> [#uses=1]
|
|
call void %tmp4(i8* %conv, i32 %mul)
|
|
ret void
|
|
}
|
|
|
|
define internal void @bar(%struct.cont_t* %c, i32 %y) nounwind ssp {
|
|
entry:
|
|
%tmp1 = getelementptr inbounds %struct.cont_t, %struct.cont_t* %c, i32 0, i32 0 ; <void (i8*, i32)**> [#uses=1]
|
|
%tmp2 = load void (i8*, i32)*, void (i8*, i32)** %tmp1 ; <void (i8*, i32)*> [#uses=1]
|
|
%tmp4 = getelementptr inbounds %struct.cont_t, %struct.cont_t* %c, i32 0, i32 1 ; <i8**> [#uses=1]
|
|
%tmp5 = load i8*, i8** %tmp4 ; <i8*> [#uses=1]
|
|
%add = add nsw i32 %y, 5 ; <i32> [#uses=1]
|
|
call void %tmp2(i8* %tmp5, i32 %add)
|
|
ret void
|
|
}
|
|
|
|
declare void @exit(i32) noreturn
|
|
|