1; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
2; RUN:     -mattr=-altivec -xcoff-traceback-table=true < %s | \
3; RUN:   FileCheck --check-prefixes=CHECK-ASM,COMMON %s
4
5; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -function-sections \
6; RUN:     -mcpu=pwr4 -mattr=-altivec < %s | \
7; RUN:   FileCheck --check-prefixes=CHECK-FUNC,COMMON %s
8
9
10%struct.S = type { i32, i32 }
11%struct.D = type { float, double }
12%struct.SD = type { %struct.S*, %struct.D }
13
14@__const.main.s = private unnamed_addr constant %struct.S { i32 10, i32 20 }, align 4
15@__const.main.d = private unnamed_addr constant %struct.D { float 1.000000e+01, double 2.000000e+01 }, align 8
16
17define double @_Z10add_structifd1SP2SD1Di(i32 %value, float %fvalue, double %dvalue, %struct.S* byval(%struct.S) align 4 %s, %struct.SD* %dp, %struct.D* byval(%struct.D) align 4 %0, i32 %v2) #0 {
18entry:
19  %d = alloca %struct.D, align 8
20  %value.addr = alloca i32, align 4
21  %fvalue.addr = alloca float, align 4
22  %dvalue.addr = alloca double, align 8
23  %dp.addr = alloca %struct.SD*, align 4
24  %v2.addr = alloca i32, align 4
25  %1 = bitcast %struct.D* %d to i8*
26  %2 = bitcast %struct.D* %0 to i8*
27  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 4 %2, i32 16, i1 false)
28  store i32 %value, i32* %value.addr, align 4
29  store float %fvalue, float* %fvalue.addr, align 4
30  store double %dvalue, double* %dvalue.addr, align 8
31  store %struct.SD* %dp, %struct.SD** %dp.addr, align 4
32  store i32 %v2, i32* %v2.addr, align 4
33  %3 = load double, double* %dvalue.addr, align 8
34  %4 = load float, float* %fvalue.addr, align 4
35  %conv = fpext float %4 to double
36  %add = fadd double %3, %conv
37  %5 = load i32, i32* %value.addr, align 4
38  %conv1 = sitofp i32 %5 to double
39  %add2 = fadd double %add, %conv1
40  %i1 = getelementptr inbounds %struct.S, %struct.S* %s, i32 0, i32 0
41  %6 = load i32, i32* %i1, align 4
42  %conv3 = sitofp i32 %6 to double
43  %add4 = fadd double %add2, %conv3
44  %7 = load %struct.SD*, %struct.SD** %dp.addr, align 4
45  %d5 = getelementptr inbounds %struct.SD, %struct.SD* %7, i32 0, i32 1
46  %d1 = getelementptr inbounds %struct.D, %struct.D* %d5, i32 0, i32 1
47  %8 = load double, double* %d1, align 8
48  %add6 = fadd double %add4, %8
49  %f1 = getelementptr inbounds %struct.D, %struct.D* %d, i32 0, i32 0
50  %9 = load float, float* %f1, align 8
51  %conv7 = fpext float %9 to double
52  %add8 = fadd double %add6, %conv7
53  %10 = load i32, i32* %v2.addr, align 4
54  %conv9 = sitofp i32 %10 to double
55  %add10 = fadd double %add8, %conv9
56  ret double %add10
57}
58
59declare void @llvm.memcpy.p0i8.p0i8.i32(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i32, i1 immarg) #1
60
61define i32 @main() {
62entry:
63  %retval = alloca i32, align 4
64  %s = alloca %struct.S, align 4
65  %d = alloca %struct.D, align 8
66  %sd = alloca %struct.SD, align 8
67  %agg.tmp = alloca %struct.S, align 4
68  %agg.tmp4 = alloca %struct.D, align 8
69  store i32 0, i32* %retval, align 4
70  %0 = bitcast %struct.S* %s to i8*
71  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%struct.S* @__const.main.s to i8*), i32 8, i1 false)
72  %1 = bitcast %struct.D* %d to i8*
73  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 bitcast (%struct.D* @__const.main.d to i8*), i32 16, i1 false)
74  %sp = getelementptr inbounds %struct.SD, %struct.SD* %sd, i32 0, i32 0
75  store %struct.S* %s, %struct.S** %sp, align 8
76  %d1 = getelementptr inbounds %struct.SD, %struct.SD* %sd, i32 0, i32 1
77  %f1 = getelementptr inbounds %struct.D, %struct.D* %d1, i32 0, i32 0
78  store float 1.000000e+02, float* %f1, align 8
79  %d2 = getelementptr inbounds %struct.SD, %struct.SD* %sd, i32 0, i32 1
80  %d13 = getelementptr inbounds %struct.D, %struct.D* %d2, i32 0, i32 1
81  store double 2.000000e+02, double* %d13, align 8
82  %2 = bitcast %struct.S* %agg.tmp to i8*
83  %3 = bitcast %struct.S* %s to i8*
84  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 %3, i32 8, i1 false)
85  %4 = bitcast %struct.D* %agg.tmp4 to i8*
86  %5 = bitcast %struct.D* %d to i8*
87  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 8 %5, i32 16, i1 false)
88  %call = call double @_Z10add_structifd1SP2SD1Di(i32 1, float 2.000000e+00, double 3.000000e+00, %struct.S* byval(%struct.S) align 4 %agg.tmp, %struct.SD* %sd, %struct.D* byval(%struct.D) align 4 %agg.tmp4, i32 7)
89  %add = fadd double %call, 1.000000e+00
90  %conv = fptosi double %add to i32
91  ret i32 %conv
92}
93
94define double @_Z7add_bari1SfdP2SD1Di(i32 %value, %struct.S* byval(%struct.S) align 4 %s, float %fvalue, double %dvalue, %struct.SD* %dp, %struct.D* byval(%struct.D) align 4 %0, i32 %v2) #0 {
95entry:
96  %d = alloca %struct.D, align 8
97  %value.addr = alloca i32, align 4
98  %fvalue.addr = alloca float, align 4
99  %dvalue.addr = alloca double, align 8
100  %dp.addr = alloca %struct.SD*, align 4
101  %v2.addr = alloca i32, align 4
102  %1 = bitcast %struct.D* %d to i8*
103  %2 = bitcast %struct.D* %0 to i8*
104  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 4 %2, i32 16, i1 false)
105  store i32 %value, i32* %value.addr, align 4
106  store float %fvalue, float* %fvalue.addr, align 4
107  store double %dvalue, double* %dvalue.addr, align 8
108  store %struct.SD* %dp, %struct.SD** %dp.addr, align 4
109  store i32 %v2, i32* %v2.addr, align 4
110  %3 = load double, double* %dvalue.addr, align 8
111  %4 = load float, float* %fvalue.addr, align 4
112  %conv = fpext float %4 to double
113  %add = fadd double %3, %conv
114  %5 = load i32, i32* %value.addr, align 4
115  %conv1 = sitofp i32 %5 to double
116  %add2 = fadd double %add, %conv1
117  %i1 = getelementptr inbounds %struct.S, %struct.S* %s, i32 0, i32 0
118  %6 = load i32, i32* %i1, align 4
119  %conv3 = sitofp i32 %6 to double
120  %add4 = fadd double %add2, %conv3
121  %7 = load %struct.SD*, %struct.SD** %dp.addr, align 4
122  %d5 = getelementptr inbounds %struct.SD, %struct.SD* %7, i32 0, i32 1
123  %d1 = getelementptr inbounds %struct.D, %struct.D* %d5, i32 0, i32 1
124  %8 = load double, double* %d1, align 8
125  %add6 = fadd double %add4, %8
126  %f1 = getelementptr inbounds %struct.D, %struct.D* %d, i32 0, i32 0
127  %9 = load float, float* %f1, align 8
128  %conv7 = fpext float %9 to double
129  %add8 = fadd double %add6, %conv7
130  %10 = load i32, i32* %v2.addr, align 4
131  %conv9 = sitofp i32 %10 to double
132  %add10 = fadd double %add8, %conv9
133  ret double %add10
134}
135
136; CHECK-ASM-LABEL:  ._Z10add_structifd1SP2SD1Di:{{[[:space:]] *}}# %bb.0:
137; CHECK-FUNC-LABEL: csect ._Z10add_structifd1SP2SD1Di[PR],2{{[[:space:]] *}}# %bb.0:
138; COMMON-NEXT:   lwz 4, L..C0(2)
139; COMMON-NEXT:   stfs 1, -24(1)
140; COMMON-NEXT:   lfs 0, 0(4)
141; COMMON-NEXT:   lwz 4, 56(1)
142; COMMON:        fsub 0, 2, 0
143; COMMON-NEXT:   stw 9, -36(1)
144; COMMON-NEXT:   fadd 1, 1, 0
145; COMMON-NEXT:   blr
146; COMMON-NEXT: L.._Z10add_structifd1SP2SD1Di0:
147; COMMON-NEXT:  .vbyte  4, 0x00000000                   # Traceback table begin
148; COMMON-NEXT:  .byte   0x00                            # Version = 0
149; COMMON-NEXT:  .byte   0x09                            # Language = CPlusPlus
150; COMMON-NEXT:  .byte   0x22                            # -IsGlobaLinkage, -IsOutOfLineEpilogOrPrologue
151; COMMON-NEXT:                                        # +HasTraceBackTableOffset, -IsInternalProcedure
152; COMMON-NEXT:                                        # -HasControlledStorage, -IsTOCless
153; COMMON-NEXT:                                        # +IsFloatingPointPresent
154; COMMON-NEXT:                                        # -IsFloatingPointOperationLogOrAbortEnabled
155; COMMON-NEXT:  .byte   0x40                            # -IsInterruptHandler, +IsFunctionNamePresent, -IsAllocaUsed
156; COMMON-NEXT:                                        # OnConditionDirective = 0, -IsCRSaved, -IsLRSaved
157; COMMON-NEXT:  .byte   0x80                            # +IsBackChainStored, -IsFixup, NumOfFPRsSaved = 0
158; COMMON-NEXT:  .byte   0x00                            # -HasVectorInfo, -HasExtensionTable, NumOfGPRsSaved = 0
159; COMMON-NEXT:  .byte   0x05                            # NumberOfFixedParms = 5
160; COMMON-NEXT:  .byte   0x05                            # NumberOfFPParms = 2, +HasParmsOnStack
161; COMMON-NEXT:  .vbyte  4, 0x58000000                   # Parameter type = i, f, d, i, i, i, i
162; CHECK-ASM-NEXT:   .vbyte  4, L.._Z10add_structifd1SP2SD1Di0-._Z10add_structifd1SP2SD1Di # Function size
163; CHECK-FUNC-NEXT:   .vbyte  4, L.._Z10add_structifd1SP2SD1Di0-._Z10add_structifd1SP2SD1Di[PR] # Function size
164; COMMON-NEXT:  .vbyte  2, 0x001a                       # Function name len = 26
165; COMMON-NEXT:  .byte   '_,'Z,'1,'0,'a,'d,'d,'_,'s,'t,'r,'u,'c,'t,'i,'f,'d,'1,'S,'P,'2,'S,'D,'1,'D,'i # Function Name
166; COMMON-NEXT:                                        # -- End function
167
168
169; CHECK-ASM-LABEL:     .main:{{[[:space:]] *}}# %bb.0:
170; CHECK-FUNC-LABEL:   .csect .main[PR],2{{[[:space:]] *}}# %bb.0
171; COMMON-NEXT:   mflr 0
172; COMMON-NEXT:   stw 0, 8(1)
173; COMMON:        mtlr 0
174; COMMON-NEXT:   blr
175; COMMON-NEXT: L..main0:
176; COMMON-NEXT:  .vbyte  4, 0x00000000                   # Traceback table begin
177; COMMON-NEXT:  .byte   0x00                            # Version = 0
178; COMMON-NEXT:  .byte   0x09                            # Language = CPlusPlus
179; COMMON-NEXT:  .byte   0x22                            # -IsGlobaLinkage, -IsOutOfLineEpilogOrPrologue
180; COMMON-NEXT:                                        # +HasTraceBackTableOffset, -IsInternalProcedure
181; COMMON-NEXT:                                        # -HasControlledStorage, -IsTOCless
182; COMMON-NEXT:                                        # +IsFloatingPointPresent
183; COMMON-NEXT:                                        # -IsFloatingPointOperationLogOrAbortEnabled
184; COMMON-NEXT:  .byte   0x41                            # -IsInterruptHandler, +IsFunctionNamePresent, -IsAllocaUsed
185; COMMON-NEXT:                                        # OnConditionDirective = 0, -IsCRSaved, +IsLRSaved
186; COMMON-NEXT:  .byte   0x80                            # +IsBackChainStored, -IsFixup, NumOfFPRsSaved = 0
187; COMMON-NEXT:  .byte   0x00                            # -HasVectorInfo, -HasExtensionTable, NumOfGPRsSaved = 0
188; COMMON-NEXT:  .byte   0x00                            # NumberOfFixedParms = 0
189; COMMON-NEXT:  .byte   0x01                            # NumberOfFPParms = 0, +HasParmsOnStack
190; CHECK-ASM-NEXT:   .vbyte  4, L..main0-.main               # Function size
191; CHECK-FUNC-NEXT:   .vbyte  4, L..main0-.main[PR]               # Function size
192; COMMON-NEXT:  .vbyte  2, 0x0004                       # Function name len = 4
193; COMMON-NEXT:  .byte   'm,'a,'i,'n                     # Function Name
194; COMMON-NEXT:                                        # -- End function
195
196
197; CHECK-ASM-LABEL:    ._Z7add_bari1SfdP2SD1Di:{{[[:space:]] *}}# %bb.0:
198; CHECK-FUNC-LABEL:   .csect ._Z7add_bari1SfdP2SD1Di[PR],2{{[[:space:]] *}}# %bb.0:
199; COMMON:       .vbyte  4, 0x00000000                   # Traceback table begin
200; COMMON-NEXT:  .byte   0x00                            # Version = 0
201; COMMON-NEXT:  .byte   0x09                            # Language = CPlusPlus
202; COMMON-NEXT:  .byte   0x22                            # -IsGlobaLinkage, -IsOutOfLineEpilogOrPrologue
203; COMMON-NEXT:                                        # +HasTraceBackTableOffset, -IsInternalProcedure
204; COMMON-NEXT:                                        # -HasControlledStorage, -IsTOCless
205; COMMON-NEXT:                                        # +IsFloatingPointPresent
206; COMMON-NEXT:                                        # -IsFloatingPointOperationLogOrAbortEnabled
207; COMMON-NEXT:  .byte   0x40                            # -IsInterruptHandler, +IsFunctionNamePresent, -IsAllocaUsed
208; COMMON-NEXT:                                        # OnConditionDirective = 0, -IsCRSaved, -IsLRSaved
209; COMMON-NEXT:  .byte   0x80                            # +IsBackChainStored, -IsFixup, NumOfFPRsSaved = 0
210; COMMON-NEXT:  .byte   0x00                            # -HasVectorInfo, -HasExtensionTable, NumOfGPRsSaved = 0
211; COMMON-NEXT:  .byte   0x05                            # NumberOfFixedParms = 5
212; COMMON-NEXT:  .byte   0x05                            # NumberOfFPParms = 2, +HasParmsOnStack
213; COMMON-NEXT:  .vbyte  4, 0x16000000                   # Parameter type = i, i, i, f, d, i, i
214; CHECK-ASM-NEXT:  .vbyte  4, L.._Z7add_bari1SfdP2SD1Di0-._Z7add_bari1SfdP2SD1Di # Function size
215; CHECK-FUNC-NEXT:  .vbyte  4, L.._Z7add_bari1SfdP2SD1Di0-._Z7add_bari1SfdP2SD1Di[PR] # Function size
216; COMMON-NEXT:  .vbyte  2, 0x0016                       # Function name len = 22
217; COMMON-NEXT:  .byte   '_,'Z,'7,'a,'d,'d,'_,'b,'a,'r,'i,'1,'S,'f,'d,'P,'2,'S,'D,'1,'D,'i # Function Name
218; COMMON-NEXT:                                        # -- End function
219