xref: /llvm-project/llvm/test/CodeGen/PowerPC/mergeable-string-pool.ll (revision 84e2fd7ee4a9bf76834151a802245bd0b6de8fd0)
1; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr8 \
2; RUN:   -ppc-merge-string-pool=true -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=AIX32,AIXDATA
3; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr8 \
4; RUN:   -ppc-merge-string-pool=true -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=AIX64,AIXDATA
5; RUN: llc -verify-machineinstrs -mtriple powerpc64-unknown-linux -mcpu=pwr8 \
6; RUN:   -ppc-merge-string-pool=true -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=LINUX64BE,LINUXDATA
7; RUN: llc -verify-machineinstrs -mtriple powerpc64le-unknown-linux -mcpu=pwr8 \
8; RUN:   -ppc-merge-string-pool=true -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=LINUX64LE,LINUXDATA
9
10
11;; This @GLOBALSTRING is a user of @.str which causes @.str to not get pooled.
12@.str = private unnamed_addr constant [47 x i8] c"This is the global string that is at the top.\0A\00", align 1
13@GLOBALSTRING = dso_local local_unnamed_addr global ptr @.str, align 8
14
15@IntArray2 = dso_local global [7 x i32] [i32 5, i32 7, i32 9, i32 11, i32 17, i32 1235, i32 32], align 4
16@.str.1 = private unnamed_addr constant [12 x i8] c"str1_STRING\00", align 1
17@.str.2 = private unnamed_addr constant [12 x i8] c"str2_STRING\00", align 1
18@.str.3 = private unnamed_addr constant [12 x i8] c"str3_STRING\00", align 1
19@.str.4 = private unnamed_addr constant [12 x i8] c"str4_STRING\00", align 1
20@.str.5 = private unnamed_addr constant [183 x i8] c"longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_STRING\00", align 1
21@__const.str6.TheString = private unnamed_addr constant [10 x i8] c"ABCABCABC\00", align 1
22@.str.6 = private unnamed_addr constant [12 x i8] c"MixedString\00", align 1
23@__const.mixed2.IntArray = private unnamed_addr constant [7 x i32] [i32 5, i32 7, i32 9, i32 11, i32 17, i32 1235, i32 32], align 4
24@__const.IntArray3 = private unnamed_addr constant [14 x i64] [i64 15, i64 7, i64 19, i64 11, i64 17, i64 1235, i64 72, i64 51, i64 32, i64 231, i64 86, i64 64, i64 754, i64 281], align 8
25@__const.IntArray4 = private unnamed_addr constant [14 x i64] [i64 15, i64 7, i64 19, i64 11, i64 17, i64 1235, i64 72, i64 51, i64 32, i64 231, i64 86, i64 64, i64 754, i64 281], align 8
26@__const.IntArray5 = private unnamed_addr constant [17 x i64] [i64 15, i64 7, i64 19, i64 11, i64 17, i64 1235, i64 72, i64 51, i64 32, i64 231, i64 86, i64 64, i64 754, i64 281, i64 61, i64 63, i64 67], align 8
27@.str.7 = private unnamed_addr constant [20 x i8] c"Different String 01\00", align 1
28@.str.8 = private unnamed_addr constant [15 x i8] c"Static Global\0A\00", align 1
29
30;; Special alignment of 128 on this string will force it to go first and have padding added.
31;; TODO: At the momment these will not be pooled because the extra alignment may be lost.
32@.str.9 = private unnamed_addr constant [17 x i8] c"str9_STRING.....\00", align 128
33@.str.10 = private unnamed_addr constant [17 x i8] c"str10_STRING....\00", align 128
34
35;; Undef constant.
36@.str.11 = private unnamed_addr constant [10 x i8] undef, align 1
37
38define dso_local signext i32 @str1() local_unnamed_addr #0 {
39; AIX32-LABEL: str1:
40; AIX32:       # %bb.0: # %entry
41; AIX32-NEXT:    mflr r0
42; AIX32-NEXT:    stwu r1, -64(r1)
43; AIX32-NEXT:    lwz r3, L..C0(r2) # @__ModuleStringPool
44; AIX32-NEXT:    stw r0, 72(r1)
45; AIX32-NEXT:    addi r3, r3, 422
46; AIX32-NEXT:    bl .callee[PR]
47; AIX32-NEXT:    nop
48; AIX32-NEXT:    addi r1, r1, 64
49; AIX32-NEXT:    lwz r0, 8(r1)
50; AIX32-NEXT:    mtlr r0
51; AIX32-NEXT:    blr
52;
53; AIX64-LABEL: str1:
54; AIX64:       # %bb.0: # %entry
55; AIX64-NEXT:    mflr r0
56; AIX64-NEXT:    stdu r1, -112(r1)
57; AIX64-NEXT:    ld r3, L..C0(r2) # @__ModuleStringPool
58; AIX64-NEXT:    std r0, 128(r1)
59; AIX64-NEXT:    addi r3, r3, 422
60; AIX64-NEXT:    bl .callee[PR]
61; AIX64-NEXT:    nop
62; AIX64-NEXT:    addi r1, r1, 112
63; AIX64-NEXT:    ld r0, 16(r1)
64; AIX64-NEXT:    mtlr r0
65; AIX64-NEXT:    blr
66;
67; LINUX64BE-LABEL: str1:
68; LINUX64BE:       # %bb.0: # %entry
69; LINUX64BE-NEXT:    mflr r0
70; LINUX64BE-NEXT:    stdu r1, -112(r1)
71; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
72; LINUX64BE-NEXT:    std r0, 128(r1)
73; LINUX64BE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
74; LINUX64BE-NEXT:    addi r3, r3, 422
75; LINUX64BE-NEXT:    bl callee
76; LINUX64BE-NEXT:    nop
77; LINUX64BE-NEXT:    addi r1, r1, 112
78; LINUX64BE-NEXT:    ld r0, 16(r1)
79; LINUX64BE-NEXT:    mtlr r0
80; LINUX64BE-NEXT:    blr
81;
82; LINUX64LE-LABEL: str1:
83; LINUX64LE:       # %bb.0: # %entry
84; LINUX64LE-NEXT:    mflr r0
85; LINUX64LE-NEXT:    stdu r1, -32(r1)
86; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
87; LINUX64LE-NEXT:    std r0, 48(r1)
88; LINUX64LE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
89; LINUX64LE-NEXT:    addi r3, r3, 422
90; LINUX64LE-NEXT:    bl callee
91; LINUX64LE-NEXT:    nop
92; LINUX64LE-NEXT:    addi r1, r1, 32
93; LINUX64LE-NEXT:    ld r0, 16(r1)
94; LINUX64LE-NEXT:    mtlr r0
95; LINUX64LE-NEXT:    blr
96entry:
97  %call = tail call signext i32 @callee(ptr noundef nonnull @.str.1)
98  ret i32 %call
99}
100
101declare signext i32 @callee(ptr noundef) local_unnamed_addr
102
103define dso_local signext i32 @str2() local_unnamed_addr #0 {
104; AIX32-LABEL: str2:
105; AIX32:       # %bb.0: # %entry
106; AIX32-NEXT:    mflr r0
107; AIX32-NEXT:    stwu r1, -64(r1)
108; AIX32-NEXT:    lwz r3, L..C0(r2) # @__ModuleStringPool
109; AIX32-NEXT:    stw r0, 72(r1)
110; AIX32-NEXT:    addi r3, r3, 388
111; AIX32-NEXT:    bl .callee[PR]
112; AIX32-NEXT:    nop
113; AIX32-NEXT:    addi r1, r1, 64
114; AIX32-NEXT:    lwz r0, 8(r1)
115; AIX32-NEXT:    mtlr r0
116; AIX32-NEXT:    blr
117;
118; AIX64-LABEL: str2:
119; AIX64:       # %bb.0: # %entry
120; AIX64-NEXT:    mflr r0
121; AIX64-NEXT:    stdu r1, -112(r1)
122; AIX64-NEXT:    ld r3, L..C0(r2) # @__ModuleStringPool
123; AIX64-NEXT:    std r0, 128(r1)
124; AIX64-NEXT:    addi r3, r3, 388
125; AIX64-NEXT:    bl .callee[PR]
126; AIX64-NEXT:    nop
127; AIX64-NEXT:    addi r1, r1, 112
128; AIX64-NEXT:    ld r0, 16(r1)
129; AIX64-NEXT:    mtlr r0
130; AIX64-NEXT:    blr
131;
132; LINUX64BE-LABEL: str2:
133; LINUX64BE:       # %bb.0: # %entry
134; LINUX64BE-NEXT:    mflr r0
135; LINUX64BE-NEXT:    stdu r1, -112(r1)
136; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
137; LINUX64BE-NEXT:    std r0, 128(r1)
138; LINUX64BE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
139; LINUX64BE-NEXT:    addi r3, r3, 388
140; LINUX64BE-NEXT:    bl callee
141; LINUX64BE-NEXT:    nop
142; LINUX64BE-NEXT:    addi r1, r1, 112
143; LINUX64BE-NEXT:    ld r0, 16(r1)
144; LINUX64BE-NEXT:    mtlr r0
145; LINUX64BE-NEXT:    blr
146;
147; LINUX64LE-LABEL: str2:
148; LINUX64LE:       # %bb.0: # %entry
149; LINUX64LE-NEXT:    mflr r0
150; LINUX64LE-NEXT:    stdu r1, -32(r1)
151; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
152; LINUX64LE-NEXT:    std r0, 48(r1)
153; LINUX64LE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
154; LINUX64LE-NEXT:    addi r3, r3, 388
155; LINUX64LE-NEXT:    bl callee
156; LINUX64LE-NEXT:    nop
157; LINUX64LE-NEXT:    addi r1, r1, 32
158; LINUX64LE-NEXT:    ld r0, 16(r1)
159; LINUX64LE-NEXT:    mtlr r0
160; LINUX64LE-NEXT:    blr
161entry:
162  %call = tail call signext i32 @callee(ptr noundef nonnull @.str.2)
163  ret i32 %call
164}
165
166define dso_local signext i32 @str3() local_unnamed_addr #0 {
167; AIX32-LABEL: str3:
168; AIX32:       # %bb.0: # %entry
169; AIX32-NEXT:    mflr r0
170; AIX32-NEXT:    stwu r1, -64(r1)
171; AIX32-NEXT:    stw r0, 72(r1)
172; AIX32-NEXT:    stw r31, 60(r1) # 4-byte Folded Spill
173; AIX32-NEXT:    lwz r31, L..C0(r2) # @__ModuleStringPool
174; AIX32-NEXT:    addi r3, r31, 434
175; AIX32-NEXT:    bl .callee[PR]
176; AIX32-NEXT:    nop
177; AIX32-NEXT:    addi r4, r31, 388
178; AIX32-NEXT:    mr r31, r3
179; AIX32-NEXT:    mr r3, r4
180; AIX32-NEXT:    bl .callee[PR]
181; AIX32-NEXT:    nop
182; AIX32-NEXT:    add r3, r3, r31
183; AIX32-NEXT:    lwz r31, 60(r1) # 4-byte Folded Reload
184; AIX32-NEXT:    addi r1, r1, 64
185; AIX32-NEXT:    lwz r0, 8(r1)
186; AIX32-NEXT:    mtlr r0
187; AIX32-NEXT:    blr
188;
189; AIX64-LABEL: str3:
190; AIX64:       # %bb.0: # %entry
191; AIX64-NEXT:    mflr r0
192; AIX64-NEXT:    stdu r1, -128(r1)
193; AIX64-NEXT:    std r0, 144(r1)
194; AIX64-NEXT:    std r30, 112(r1) # 8-byte Folded Spill
195; AIX64-NEXT:    ld r30, L..C0(r2) # @__ModuleStringPool
196; AIX64-NEXT:    std r31, 120(r1) # 8-byte Folded Spill
197; AIX64-NEXT:    addi r3, r30, 434
198; AIX64-NEXT:    bl .callee[PR]
199; AIX64-NEXT:    nop
200; AIX64-NEXT:    mr r31, r3
201; AIX64-NEXT:    addi r3, r30, 388
202; AIX64-NEXT:    bl .callee[PR]
203; AIX64-NEXT:    nop
204; AIX64-NEXT:    add r3, r3, r31
205; AIX64-NEXT:    ld r31, 120(r1) # 8-byte Folded Reload
206; AIX64-NEXT:    ld r30, 112(r1) # 8-byte Folded Reload
207; AIX64-NEXT:    extsw r3, r3
208; AIX64-NEXT:    addi r1, r1, 128
209; AIX64-NEXT:    ld r0, 16(r1)
210; AIX64-NEXT:    mtlr r0
211; AIX64-NEXT:    blr
212;
213; LINUX64BE-LABEL: str3:
214; LINUX64BE:       # %bb.0: # %entry
215; LINUX64BE-NEXT:    mflr r0
216; LINUX64BE-NEXT:    stdu r1, -144(r1)
217; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
218; LINUX64BE-NEXT:    std r0, 160(r1)
219; LINUX64BE-NEXT:    std r29, 120(r1) # 8-byte Folded Spill
220; LINUX64BE-NEXT:    std r30, 128(r1) # 8-byte Folded Spill
221; LINUX64BE-NEXT:    addi r29, r3, .L__ModuleStringPool@toc@l
222; LINUX64BE-NEXT:    addi r3, r29, 434
223; LINUX64BE-NEXT:    bl callee
224; LINUX64BE-NEXT:    nop
225; LINUX64BE-NEXT:    mr r30, r3
226; LINUX64BE-NEXT:    addi r3, r29, 388
227; LINUX64BE-NEXT:    bl callee
228; LINUX64BE-NEXT:    nop
229; LINUX64BE-NEXT:    add r3, r3, r30
230; LINUX64BE-NEXT:    ld r30, 128(r1) # 8-byte Folded Reload
231; LINUX64BE-NEXT:    ld r29, 120(r1) # 8-byte Folded Reload
232; LINUX64BE-NEXT:    extsw r3, r3
233; LINUX64BE-NEXT:    addi r1, r1, 144
234; LINUX64BE-NEXT:    ld r0, 16(r1)
235; LINUX64BE-NEXT:    mtlr r0
236; LINUX64BE-NEXT:    blr
237;
238; LINUX64LE-LABEL: str3:
239; LINUX64LE:       # %bb.0: # %entry
240; LINUX64LE-NEXT:    mflr r0
241; LINUX64LE-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
242; LINUX64LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
243; LINUX64LE-NEXT:    stdu r1, -64(r1)
244; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
245; LINUX64LE-NEXT:    std r0, 80(r1)
246; LINUX64LE-NEXT:    addi r29, r3, .L__ModuleStringPool@toc@l
247; LINUX64LE-NEXT:    addi r3, r29, 434
248; LINUX64LE-NEXT:    bl callee
249; LINUX64LE-NEXT:    nop
250; LINUX64LE-NEXT:    mr r30, r3
251; LINUX64LE-NEXT:    addi r3, r29, 388
252; LINUX64LE-NEXT:    bl callee
253; LINUX64LE-NEXT:    nop
254; LINUX64LE-NEXT:    add r3, r3, r30
255; LINUX64LE-NEXT:    extsw r3, r3
256; LINUX64LE-NEXT:    addi r1, r1, 64
257; LINUX64LE-NEXT:    ld r0, 16(r1)
258; LINUX64LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
259; LINUX64LE-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
260; LINUX64LE-NEXT:    mtlr r0
261; LINUX64LE-NEXT:    blr
262entry:
263  %call = tail call signext i32 @callee(ptr noundef nonnull @.str.3)
264  %call1 = tail call signext i32 @callee(ptr noundef nonnull @.str.2)
265  %add = add nsw i32 %call1, %call
266  ret i32 %add
267}
268
269define dso_local signext i32 @str4() local_unnamed_addr #0 {
270; AIX32-LABEL: str4:
271; AIX32:       # %bb.0: # %entry
272; AIX32-NEXT:    mflr r0
273; AIX32-NEXT:    stwu r1, -64(r1)
274; AIX32-NEXT:    lwz r3, L..C0(r2) # @__ModuleStringPool
275; AIX32-NEXT:    stw r0, 72(r1)
276; AIX32-NEXT:    addi r3, r3, 446
277; AIX32-NEXT:    bl .callee[PR]
278; AIX32-NEXT:    nop
279; AIX32-NEXT:    addi r1, r1, 64
280; AIX32-NEXT:    lwz r0, 8(r1)
281; AIX32-NEXT:    mtlr r0
282; AIX32-NEXT:    blr
283;
284; AIX64-LABEL: str4:
285; AIX64:       # %bb.0: # %entry
286; AIX64-NEXT:    mflr r0
287; AIX64-NEXT:    stdu r1, -112(r1)
288; AIX64-NEXT:    ld r3, L..C0(r2) # @__ModuleStringPool
289; AIX64-NEXT:    std r0, 128(r1)
290; AIX64-NEXT:    addi r3, r3, 446
291; AIX64-NEXT:    bl .callee[PR]
292; AIX64-NEXT:    nop
293; AIX64-NEXT:    addi r1, r1, 112
294; AIX64-NEXT:    ld r0, 16(r1)
295; AIX64-NEXT:    mtlr r0
296; AIX64-NEXT:    blr
297;
298; LINUX64BE-LABEL: str4:
299; LINUX64BE:       # %bb.0: # %entry
300; LINUX64BE-NEXT:    mflr r0
301; LINUX64BE-NEXT:    stdu r1, -112(r1)
302; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
303; LINUX64BE-NEXT:    std r0, 128(r1)
304; LINUX64BE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
305; LINUX64BE-NEXT:    addi r3, r3, 446
306; LINUX64BE-NEXT:    bl callee
307; LINUX64BE-NEXT:    nop
308; LINUX64BE-NEXT:    addi r1, r1, 112
309; LINUX64BE-NEXT:    ld r0, 16(r1)
310; LINUX64BE-NEXT:    mtlr r0
311; LINUX64BE-NEXT:    blr
312;
313; LINUX64LE-LABEL: str4:
314; LINUX64LE:       # %bb.0: # %entry
315; LINUX64LE-NEXT:    mflr r0
316; LINUX64LE-NEXT:    stdu r1, -32(r1)
317; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
318; LINUX64LE-NEXT:    std r0, 48(r1)
319; LINUX64LE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
320; LINUX64LE-NEXT:    addi r3, r3, 446
321; LINUX64LE-NEXT:    bl callee
322; LINUX64LE-NEXT:    nop
323; LINUX64LE-NEXT:    addi r1, r1, 32
324; LINUX64LE-NEXT:    ld r0, 16(r1)
325; LINUX64LE-NEXT:    mtlr r0
326; LINUX64LE-NEXT:    blr
327entry:
328  %call = tail call signext i32 @callee(ptr noundef nonnull @.str.4)
329  ret i32 %call
330}
331
332define dso_local signext i32 @str5() local_unnamed_addr #0 {
333; AIX32-LABEL: str5:
334; AIX32:       # %bb.0: # %entry
335; AIX32-NEXT:    mflr r0
336; AIX32-NEXT:    stwu r1, -64(r1)
337; AIX32-NEXT:    lwz r3, L..C0(r2) # @__ModuleStringPool
338; AIX32-NEXT:    stw r0, 72(r1)
339; AIX32-NEXT:    addi r3, r3, 493
340; AIX32-NEXT:    bl .callee[PR]
341; AIX32-NEXT:    nop
342; AIX32-NEXT:    addi r1, r1, 64
343; AIX32-NEXT:    lwz r0, 8(r1)
344; AIX32-NEXT:    mtlr r0
345; AIX32-NEXT:    blr
346;
347; AIX64-LABEL: str5:
348; AIX64:       # %bb.0: # %entry
349; AIX64-NEXT:    mflr r0
350; AIX64-NEXT:    stdu r1, -112(r1)
351; AIX64-NEXT:    ld r3, L..C0(r2) # @__ModuleStringPool
352; AIX64-NEXT:    std r0, 128(r1)
353; AIX64-NEXT:    addi r3, r3, 493
354; AIX64-NEXT:    bl .callee[PR]
355; AIX64-NEXT:    nop
356; AIX64-NEXT:    addi r1, r1, 112
357; AIX64-NEXT:    ld r0, 16(r1)
358; AIX64-NEXT:    mtlr r0
359; AIX64-NEXT:    blr
360;
361; LINUX64BE-LABEL: str5:
362; LINUX64BE:       # %bb.0: # %entry
363; LINUX64BE-NEXT:    mflr r0
364; LINUX64BE-NEXT:    stdu r1, -112(r1)
365; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
366; LINUX64BE-NEXT:    std r0, 128(r1)
367; LINUX64BE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
368; LINUX64BE-NEXT:    addi r3, r3, 493
369; LINUX64BE-NEXT:    bl callee
370; LINUX64BE-NEXT:    nop
371; LINUX64BE-NEXT:    addi r1, r1, 112
372; LINUX64BE-NEXT:    ld r0, 16(r1)
373; LINUX64BE-NEXT:    mtlr r0
374; LINUX64BE-NEXT:    blr
375;
376; LINUX64LE-LABEL: str5:
377; LINUX64LE:       # %bb.0: # %entry
378; LINUX64LE-NEXT:    mflr r0
379; LINUX64LE-NEXT:    stdu r1, -32(r1)
380; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
381; LINUX64LE-NEXT:    std r0, 48(r1)
382; LINUX64LE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
383; LINUX64LE-NEXT:    addi r3, r3, 493
384; LINUX64LE-NEXT:    bl callee
385; LINUX64LE-NEXT:    nop
386; LINUX64LE-NEXT:    addi r1, r1, 32
387; LINUX64LE-NEXT:    ld r0, 16(r1)
388; LINUX64LE-NEXT:    mtlr r0
389; LINUX64LE-NEXT:    blr
390entry:
391  %call = tail call signext i32 @callee(ptr noundef nonnull @.str.5)
392  ret i32 %call
393}
394
395define dso_local signext i32 @array1() local_unnamed_addr #0 {
396; AIX32-LABEL: array1:
397; AIX32:       # %bb.0: # %entry
398; AIX32-NEXT:    mflr r0
399; AIX32-NEXT:    stwu r1, -96(r1)
400; AIX32-NEXT:    lwz r3, L..C0(r2) # @__ModuleStringPool
401; AIX32-NEXT:    li r4, 372
402; AIX32-NEXT:    li r5, 360
403; AIX32-NEXT:    stw r0, 104(r1)
404; AIX32-NEXT:    lxvw4x vs0, r3, r4
405; AIX32-NEXT:    lxvw4x vs1, r3, r5
406; AIX32-NEXT:    li r4, 12
407; AIX32-NEXT:    addi r3, r1, 64
408; AIX32-NEXT:    rlwimi r4, r3, 0, 30, 27
409; AIX32-NEXT:    stxvw4x vs0, 0, r4
410; AIX32-NEXT:    stxvw4x vs1, 0, r3
411; AIX32-NEXT:    bl .calleeInt[PR]
412; AIX32-NEXT:    nop
413; AIX32-NEXT:    addi r1, r1, 96
414; AIX32-NEXT:    lwz r0, 8(r1)
415; AIX32-NEXT:    mtlr r0
416; AIX32-NEXT:    blr
417;
418; AIX64-LABEL: array1:
419; AIX64:       # %bb.0: # %entry
420; AIX64-NEXT:    mflr r0
421; AIX64-NEXT:    stdu r1, -144(r1)
422; AIX64-NEXT:    ld r3, L..C0(r2) # @__ModuleStringPool
423; AIX64-NEXT:    li r4, 372
424; AIX64-NEXT:    li r5, 360
425; AIX64-NEXT:    std r0, 160(r1)
426; AIX64-NEXT:    lxvw4x vs0, r3, r4
427; AIX64-NEXT:    lxvw4x vs1, r3, r5
428; AIX64-NEXT:    addi r4, r1, 124
429; AIX64-NEXT:    addi r3, r1, 112
430; AIX64-NEXT:    stxvw4x vs0, 0, r4
431; AIX64-NEXT:    stxvw4x vs1, 0, r3
432; AIX64-NEXT:    bl .calleeInt[PR]
433; AIX64-NEXT:    nop
434; AIX64-NEXT:    addi r1, r1, 144
435; AIX64-NEXT:    ld r0, 16(r1)
436; AIX64-NEXT:    mtlr r0
437; AIX64-NEXT:    blr
438;
439; LINUX64BE-LABEL: array1:
440; LINUX64BE:       # %bb.0: # %entry
441; LINUX64BE-NEXT:    mflr r0
442; LINUX64BE-NEXT:    stdu r1, -144(r1)
443; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
444; LINUX64BE-NEXT:    li r4, 372
445; LINUX64BE-NEXT:    li r5, 360
446; LINUX64BE-NEXT:    std r0, 160(r1)
447; LINUX64BE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
448; LINUX64BE-NEXT:    lxvw4x vs0, r3, r4
449; LINUX64BE-NEXT:    lxvw4x vs1, r3, r5
450; LINUX64BE-NEXT:    addi r4, r1, 124
451; LINUX64BE-NEXT:    addi r3, r1, 112
452; LINUX64BE-NEXT:    stxvw4x vs0, 0, r4
453; LINUX64BE-NEXT:    stxvw4x vs1, 0, r3
454; LINUX64BE-NEXT:    bl calleeInt
455; LINUX64BE-NEXT:    nop
456; LINUX64BE-NEXT:    addi r1, r1, 144
457; LINUX64BE-NEXT:    ld r0, 16(r1)
458; LINUX64BE-NEXT:    mtlr r0
459; LINUX64BE-NEXT:    blr
460;
461; LINUX64LE-LABEL: array1:
462; LINUX64LE:       # %bb.0: # %entry
463; LINUX64LE-NEXT:    mflr r0
464; LINUX64LE-NEXT:    stdu r1, -64(r1)
465; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
466; LINUX64LE-NEXT:    li r4, 372
467; LINUX64LE-NEXT:    li r5, 360
468; LINUX64LE-NEXT:    std r0, 80(r1)
469; LINUX64LE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
470; LINUX64LE-NEXT:    lxvd2x vs0, r3, r4
471; LINUX64LE-NEXT:    lxvd2x vs1, r3, r5
472; LINUX64LE-NEXT:    addi r4, r1, 44
473; LINUX64LE-NEXT:    addi r3, r1, 32
474; LINUX64LE-NEXT:    stxvd2x vs0, 0, r4
475; LINUX64LE-NEXT:    stxvd2x vs1, 0, r3
476; LINUX64LE-NEXT:    bl calleeInt
477; LINUX64LE-NEXT:    nop
478; LINUX64LE-NEXT:    addi r1, r1, 64
479; LINUX64LE-NEXT:    ld r0, 16(r1)
480; LINUX64LE-NEXT:    mtlr r0
481; LINUX64LE-NEXT:    blr
482entry:
483  %IntArray = alloca [7 x i32], align 4
484  call void @llvm.lifetime.start.p0(i64 28, ptr nonnull %IntArray)
485  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(28) %IntArray, ptr noundef nonnull align 4 dereferenceable(28) @__const.mixed2.IntArray, i64 28, i1 false)
486  %call = call signext i32 @calleeInt(ptr noundef nonnull %IntArray)
487  call void @llvm.lifetime.end.p0(i64 28, ptr nonnull %IntArray)
488  ret i32 %call
489}
490
491declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
492declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg)
493declare signext i32 @calleeInt(ptr noundef) local_unnamed_addr
494declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
495
496define dso_local double @DValue1() local_unnamed_addr #0 {
497; LINUX-LABEL: DValue1:
498; LINUX:       # %bb.0: # %entry
499; LINUX-NEXT:    addis 3, 2, .LCPI6_0@toc@ha
500; LINUX-NEXT:    lfd 1, .LCPI6_0@toc@l(3)
501; LINUX-NEXT:    blr
502; AIX32-LABEL: DValue1:
503; AIX32:       # %bb.0: # %entry
504; AIX32-NEXT:    lwz r3, L..C1(r2) # %const.0
505; AIX32-NEXT:    lfd f1, 0(r3)
506; AIX32-NEXT:    blr
507;
508; AIX64-LABEL: DValue1:
509; AIX64:       # %bb.0: # %entry
510; AIX64-NEXT:    ld r3, L..C1(r2) # %const.0
511; AIX64-NEXT:    lfd f1, 0(r3)
512; AIX64-NEXT:    blr
513;
514; LINUX64BE-LABEL: DValue1:
515; LINUX64BE:       # %bb.0: # %entry
516; LINUX64BE-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
517; LINUX64BE-NEXT:    lfd f1, .LCPI6_0@toc@l(r3)
518; LINUX64BE-NEXT:    blr
519;
520; LINUX64LE-LABEL: DValue1:
521; LINUX64LE:       # %bb.0: # %entry
522; LINUX64LE-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
523; LINUX64LE-NEXT:    lfd f1, .LCPI6_0@toc@l(r3)
524; LINUX64LE-NEXT:    blr
525entry:
526  ret double 3.141590e+00
527}
528
529define dso_local signext i32 @str6() local_unnamed_addr #0 {
530; AIX32-LABEL: str6:
531; AIX32:       # %bb.0: # %entry
532; AIX32-NEXT:    mflr r0
533; AIX32-NEXT:    stwu r1, -80(r1)
534; AIX32-NEXT:    li r3, 17152
535; AIX32-NEXT:    lis r4, 16963
536; AIX32-NEXT:    stw r0, 88(r1)
537; AIX32-NEXT:    lis r5, 16706
538; AIX32-NEXT:    sth r3, 72(r1)
539; AIX32-NEXT:    ori r3, r4, 16706
540; AIX32-NEXT:    ori r4, r5, 17217
541; AIX32-NEXT:    stw r31, 76(r1) # 4-byte Folded Spill
542; AIX32-NEXT:    stw r3, 68(r1)
543; AIX32-NEXT:    addi r3, r1, 64
544; AIX32-NEXT:    stw r4, 64(r1)
545; AIX32-NEXT:    bl .callee[PR]
546; AIX32-NEXT:    nop
547; AIX32-NEXT:    addi r4, r1, 69
548; AIX32-NEXT:    mr r31, r3
549; AIX32-NEXT:    mr r3, r4
550; AIX32-NEXT:    bl .callee[PR]
551; AIX32-NEXT:    nop
552; AIX32-NEXT:    add r3, r3, r31
553; AIX32-NEXT:    lwz r31, 76(r1) # 4-byte Folded Reload
554; AIX32-NEXT:    addi r1, r1, 80
555; AIX32-NEXT:    lwz r0, 8(r1)
556; AIX32-NEXT:    mtlr r0
557; AIX32-NEXT:    blr
558;
559; AIX64-LABEL: str6:
560; AIX64:       # %bb.0: # %entry
561; AIX64-NEXT:    mflr r0
562; AIX64-NEXT:    stdu r1, -144(r1)
563; AIX64-NEXT:    lis r3, 16706
564; AIX64-NEXT:    std r0, 160(r1)
565; AIX64-NEXT:    li r4, 17152
566; AIX64-NEXT:    std r31, 136(r1) # 8-byte Folded Spill
567; AIX64-NEXT:    ori r3, r3, 17217
568; AIX64-NEXT:    rldic r3, r3, 32, 1
569; AIX64-NEXT:    oris r3, r3, 16963
570; AIX64-NEXT:    sth r4, 128(r1)
571; AIX64-NEXT:    ori r3, r3, 16706
572; AIX64-NEXT:    std r3, 120(r1)
573; AIX64-NEXT:    addi r3, r1, 120
574; AIX64-NEXT:    bl .callee[PR]
575; AIX64-NEXT:    nop
576; AIX64-NEXT:    mr r31, r3
577; AIX64-NEXT:    addi r3, r1, 125
578; AIX64-NEXT:    bl .callee[PR]
579; AIX64-NEXT:    nop
580; AIX64-NEXT:    add r3, r3, r31
581; AIX64-NEXT:    ld r31, 136(r1) # 8-byte Folded Reload
582; AIX64-NEXT:    extsw r3, r3
583; AIX64-NEXT:    addi r1, r1, 144
584; AIX64-NEXT:    ld r0, 16(r1)
585; AIX64-NEXT:    mtlr r0
586; AIX64-NEXT:    blr
587;
588; LINUX64BE-LABEL: str6:
589; LINUX64BE:       # %bb.0: # %entry
590; LINUX64BE-NEXT:    mflr r0
591; LINUX64BE-NEXT:    stdu r1, -144(r1)
592; LINUX64BE-NEXT:    lis r3, 16706
593; LINUX64BE-NEXT:    std r0, 160(r1)
594; LINUX64BE-NEXT:    li r4, 17152
595; LINUX64BE-NEXT:    std r30, 128(r1) # 8-byte Folded Spill
596; LINUX64BE-NEXT:    ori r3, r3, 17217
597; LINUX64BE-NEXT:    rldic r3, r3, 32, 1
598; LINUX64BE-NEXT:    oris r3, r3, 16963
599; LINUX64BE-NEXT:    sth r4, 120(r1)
600; LINUX64BE-NEXT:    ori r3, r3, 16706
601; LINUX64BE-NEXT:    std r3, 112(r1)
602; LINUX64BE-NEXT:    addi r3, r1, 112
603; LINUX64BE-NEXT:    bl callee
604; LINUX64BE-NEXT:    nop
605; LINUX64BE-NEXT:    mr r30, r3
606; LINUX64BE-NEXT:    addi r3, r1, 117
607; LINUX64BE-NEXT:    bl callee
608; LINUX64BE-NEXT:    nop
609; LINUX64BE-NEXT:    add r3, r3, r30
610; LINUX64BE-NEXT:    ld r30, 128(r1) # 8-byte Folded Reload
611; LINUX64BE-NEXT:    extsw r3, r3
612; LINUX64BE-NEXT:    addi r1, r1, 144
613; LINUX64BE-NEXT:    ld r0, 16(r1)
614; LINUX64BE-NEXT:    mtlr r0
615; LINUX64BE-NEXT:    blr
616;
617; LINUX64LE-LABEL: str6:
618; LINUX64LE:       # %bb.0: # %entry
619; LINUX64LE-NEXT:    mflr r0
620; LINUX64LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
621; LINUX64LE-NEXT:    stdu r1, -64(r1)
622; LINUX64LE-NEXT:    lis r3, 8480
623; LINUX64LE-NEXT:    std r0, 80(r1)
624; LINUX64LE-NEXT:    li r4, 67
625; LINUX64LE-NEXT:    ori r3, r3, 41377
626; LINUX64LE-NEXT:    sth r4, 40(r1)
627; LINUX64LE-NEXT:    rldic r3, r3, 33, 1
628; LINUX64LE-NEXT:    oris r3, r3, 16707
629; LINUX64LE-NEXT:    ori r3, r3, 16961
630; LINUX64LE-NEXT:    std r3, 32(r1)
631; LINUX64LE-NEXT:    addi r3, r1, 32
632; LINUX64LE-NEXT:    bl callee
633; LINUX64LE-NEXT:    nop
634; LINUX64LE-NEXT:    mr r30, r3
635; LINUX64LE-NEXT:    addi r3, r1, 37
636; LINUX64LE-NEXT:    bl callee
637; LINUX64LE-NEXT:    nop
638; LINUX64LE-NEXT:    add r3, r3, r30
639; LINUX64LE-NEXT:    extsw r3, r3
640; LINUX64LE-NEXT:    addi r1, r1, 64
641; LINUX64LE-NEXT:    ld r0, 16(r1)
642; LINUX64LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
643; LINUX64LE-NEXT:    mtlr r0
644; LINUX64LE-NEXT:    blr
645entry:
646  %TheString = alloca [10 x i8], align 1
647  call void @llvm.lifetime.start.p0(i64 10, ptr nonnull %TheString)
648  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(10) %TheString, ptr noundef nonnull align 1 dereferenceable(10) @__const.str6.TheString, i64 10, i1 false)
649  %call = call signext i32 @callee(ptr noundef nonnull %TheString)
650  %add.ptr = getelementptr inbounds i8, ptr %TheString, i64 5
651  %call2 = call signext i32 @callee(ptr noundef nonnull %add.ptr)
652  %add = add nsw i32 %call2, %call
653  call void @llvm.lifetime.end.p0(i64 10, ptr nonnull %TheString)
654  ret i32 %add
655}
656
657define dso_local signext i32 @str7() local_unnamed_addr #0 {
658; AIX32-LABEL: str7:
659; AIX32:       # %bb.0: # %entry
660; AIX32-NEXT:    mflr r0
661; AIX32-NEXT:    stwu r1, -64(r1)
662; AIX32-NEXT:    lwz r3, L..C2(r2) # @GLOBALSTRING
663; AIX32-NEXT:    stw r0, 72(r1)
664; AIX32-NEXT:    stw r31, 60(r1) # 4-byte Folded Spill
665; AIX32-NEXT:    lwz r3, 0(r3)
666; AIX32-NEXT:    bl .callee[PR]
667; AIX32-NEXT:    nop
668; AIX32-NEXT:    lwz r4, L..C0(r2) # @__ModuleStringPool
669; AIX32-NEXT:    mr r31, r3
670; AIX32-NEXT:    addi r4, r4, 458
671; AIX32-NEXT:    mr r3, r4
672; AIX32-NEXT:    bl .callee[PR]
673; AIX32-NEXT:    nop
674; AIX32-NEXT:    add r3, r3, r31
675; AIX32-NEXT:    lwz r31, 60(r1) # 4-byte Folded Reload
676; AIX32-NEXT:    addi r1, r1, 64
677; AIX32-NEXT:    lwz r0, 8(r1)
678; AIX32-NEXT:    mtlr r0
679; AIX32-NEXT:    blr
680;
681; AIX64-LABEL: str7:
682; AIX64:       # %bb.0: # %entry
683; AIX64-NEXT:    mflr r0
684; AIX64-NEXT:    stdu r1, -128(r1)
685; AIX64-NEXT:    ld r3, L..C2(r2) # @GLOBALSTRING
686; AIX64-NEXT:    std r0, 144(r1)
687; AIX64-NEXT:    std r31, 120(r1) # 8-byte Folded Spill
688; AIX64-NEXT:    ld r3, 0(r3)
689; AIX64-NEXT:    bl .callee[PR]
690; AIX64-NEXT:    nop
691; AIX64-NEXT:    mr r31, r3
692; AIX64-NEXT:    ld r3, L..C0(r2) # @__ModuleStringPool
693; AIX64-NEXT:    addi r3, r3, 458
694; AIX64-NEXT:    bl .callee[PR]
695; AIX64-NEXT:    nop
696; AIX64-NEXT:    add r3, r3, r31
697; AIX64-NEXT:    ld r31, 120(r1) # 8-byte Folded Reload
698; AIX64-NEXT:    extsw r3, r3
699; AIX64-NEXT:    addi r1, r1, 128
700; AIX64-NEXT:    ld r0, 16(r1)
701; AIX64-NEXT:    mtlr r0
702; AIX64-NEXT:    blr
703;
704; LINUX64BE-LABEL: str7:
705; LINUX64BE:       # %bb.0: # %entry
706; LINUX64BE-NEXT:    mflr r0
707; LINUX64BE-NEXT:    stdu r1, -128(r1)
708; LINUX64BE-NEXT:    std r0, 144(r1)
709; LINUX64BE-NEXT:    addis r3, r2, GLOBALSTRING@toc@ha
710; LINUX64BE-NEXT:    std r30, 112(r1) # 8-byte Folded Spill
711; LINUX64BE-NEXT:    ld r3, GLOBALSTRING@toc@l(r3)
712; LINUX64BE-NEXT:    bl callee
713; LINUX64BE-NEXT:    nop
714; LINUX64BE-NEXT:    mr r30, r3
715; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
716; LINUX64BE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
717; LINUX64BE-NEXT:    addi r3, r3, 458
718; LINUX64BE-NEXT:    bl callee
719; LINUX64BE-NEXT:    nop
720; LINUX64BE-NEXT:    add r3, r3, r30
721; LINUX64BE-NEXT:    ld r30, 112(r1) # 8-byte Folded Reload
722; LINUX64BE-NEXT:    extsw r3, r3
723; LINUX64BE-NEXT:    addi r1, r1, 128
724; LINUX64BE-NEXT:    ld r0, 16(r1)
725; LINUX64BE-NEXT:    mtlr r0
726; LINUX64BE-NEXT:    blr
727;
728; LINUX64LE-LABEL: str7:
729; LINUX64LE:       # %bb.0: # %entry
730; LINUX64LE-NEXT:    mflr r0
731; LINUX64LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
732; LINUX64LE-NEXT:    stdu r1, -48(r1)
733; LINUX64LE-NEXT:    std r0, 64(r1)
734; LINUX64LE-NEXT:    addis r3, r2, GLOBALSTRING@toc@ha
735; LINUX64LE-NEXT:    ld r3, GLOBALSTRING@toc@l(r3)
736; LINUX64LE-NEXT:    bl callee
737; LINUX64LE-NEXT:    nop
738; LINUX64LE-NEXT:    mr r30, r3
739; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
740; LINUX64LE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
741; LINUX64LE-NEXT:    addi r3, r3, 458
742; LINUX64LE-NEXT:    bl callee
743; LINUX64LE-NEXT:    nop
744; LINUX64LE-NEXT:    add r3, r3, r30
745; LINUX64LE-NEXT:    extsw r3, r3
746; LINUX64LE-NEXT:    addi r1, r1, 48
747; LINUX64LE-NEXT:    ld r0, 16(r1)
748; LINUX64LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
749; LINUX64LE-NEXT:    mtlr r0
750; LINUX64LE-NEXT:    blr
751entry:
752  %0 = load ptr, ptr @GLOBALSTRING, align 8
753  %call = tail call signext i32 @callee(ptr noundef %0)
754  %call1 = tail call signext i32 @callee(ptr noundef nonnull @.str.8)
755  %add = add nsw i32 %call1, %call
756  ret i32 %add
757}
758
759define dso_local signext i32 @mixed1() local_unnamed_addr #0 {
760; AIX32-LABEL: mixed1:
761; AIX32:       # %bb.0: # %entry
762; AIX32-NEXT:    mflr r0
763; AIX32-NEXT:    stwu r1, -64(r1)
764; AIX32-NEXT:    lwz r3, L..C3(r2) # @IntArray2
765; AIX32-NEXT:    stw r0, 72(r1)
766; AIX32-NEXT:    stw r31, 60(r1) # 4-byte Folded Spill
767; AIX32-NEXT:    bl .calleeInt[PR]
768; AIX32-NEXT:    nop
769; AIX32-NEXT:    lwz r4, L..C0(r2) # @__ModuleStringPool
770; AIX32-NEXT:    mr r31, r3
771; AIX32-NEXT:    addi r4, r4, 400
772; AIX32-NEXT:    mr r3, r4
773; AIX32-NEXT:    bl .callee[PR]
774; AIX32-NEXT:    nop
775; AIX32-NEXT:    add r3, r3, r31
776; AIX32-NEXT:    lwz r31, 60(r1) # 4-byte Folded Reload
777; AIX32-NEXT:    addi r1, r1, 64
778; AIX32-NEXT:    lwz r0, 8(r1)
779; AIX32-NEXT:    mtlr r0
780; AIX32-NEXT:    blr
781;
782; AIX64-LABEL: mixed1:
783; AIX64:       # %bb.0: # %entry
784; AIX64-NEXT:    mflr r0
785; AIX64-NEXT:    stdu r1, -128(r1)
786; AIX64-NEXT:    ld r3, L..C3(r2) # @IntArray2
787; AIX64-NEXT:    std r0, 144(r1)
788; AIX64-NEXT:    std r31, 120(r1) # 8-byte Folded Spill
789; AIX64-NEXT:    bl .calleeInt[PR]
790; AIX64-NEXT:    nop
791; AIX64-NEXT:    mr r31, r3
792; AIX64-NEXT:    ld r3, L..C0(r2) # @__ModuleStringPool
793; AIX64-NEXT:    addi r3, r3, 400
794; AIX64-NEXT:    bl .callee[PR]
795; AIX64-NEXT:    nop
796; AIX64-NEXT:    add r3, r3, r31
797; AIX64-NEXT:    ld r31, 120(r1) # 8-byte Folded Reload
798; AIX64-NEXT:    extsw r3, r3
799; AIX64-NEXT:    addi r1, r1, 128
800; AIX64-NEXT:    ld r0, 16(r1)
801; AIX64-NEXT:    mtlr r0
802; AIX64-NEXT:    blr
803;
804; LINUX64BE-LABEL: mixed1:
805; LINUX64BE:       # %bb.0: # %entry
806; LINUX64BE-NEXT:    mflr r0
807; LINUX64BE-NEXT:    stdu r1, -128(r1)
808; LINUX64BE-NEXT:    addis r3, r2, IntArray2@toc@ha
809; LINUX64BE-NEXT:    std r0, 144(r1)
810; LINUX64BE-NEXT:    std r30, 112(r1) # 8-byte Folded Spill
811; LINUX64BE-NEXT:    addi r3, r3, IntArray2@toc@l
812; LINUX64BE-NEXT:    bl calleeInt
813; LINUX64BE-NEXT:    nop
814; LINUX64BE-NEXT:    mr r30, r3
815; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
816; LINUX64BE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
817; LINUX64BE-NEXT:    addi r3, r3, 400
818; LINUX64BE-NEXT:    bl callee
819; LINUX64BE-NEXT:    nop
820; LINUX64BE-NEXT:    add r3, r3, r30
821; LINUX64BE-NEXT:    ld r30, 112(r1) # 8-byte Folded Reload
822; LINUX64BE-NEXT:    extsw r3, r3
823; LINUX64BE-NEXT:    addi r1, r1, 128
824; LINUX64BE-NEXT:    ld r0, 16(r1)
825; LINUX64BE-NEXT:    mtlr r0
826; LINUX64BE-NEXT:    blr
827;
828; LINUX64LE-LABEL: mixed1:
829; LINUX64LE:       # %bb.0: # %entry
830; LINUX64LE-NEXT:    mflr r0
831; LINUX64LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
832; LINUX64LE-NEXT:    stdu r1, -48(r1)
833; LINUX64LE-NEXT:    addis r3, r2, IntArray2@toc@ha
834; LINUX64LE-NEXT:    std r0, 64(r1)
835; LINUX64LE-NEXT:    addi r3, r3, IntArray2@toc@l
836; LINUX64LE-NEXT:    bl calleeInt
837; LINUX64LE-NEXT:    nop
838; LINUX64LE-NEXT:    mr r30, r3
839; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
840; LINUX64LE-NEXT:    addi r3, r3, .L__ModuleStringPool@toc@l
841; LINUX64LE-NEXT:    addi r3, r3, 400
842; LINUX64LE-NEXT:    bl callee
843; LINUX64LE-NEXT:    nop
844; LINUX64LE-NEXT:    add r3, r3, r30
845; LINUX64LE-NEXT:    extsw r3, r3
846; LINUX64LE-NEXT:    addi r1, r1, 48
847; LINUX64LE-NEXT:    ld r0, 16(r1)
848; LINUX64LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
849; LINUX64LE-NEXT:    mtlr r0
850; LINUX64LE-NEXT:    blr
851entry:
852  %call = tail call signext i32 @calleeInt(ptr noundef nonnull @IntArray2)
853  %call1 = tail call signext i32 @callee(ptr noundef nonnull @.str.6)
854  %add = add nsw i32 %call1, %call
855  ret i32 %add
856}
857
858define dso_local signext i32 @mixed2() local_unnamed_addr #0 {
859; AIX32-LABEL: mixed2:
860; AIX32:       # %bb.0: # %entry
861; AIX32-NEXT:    mflr r0
862; AIX32-NEXT:    stwu r1, -112(r1)
863; AIX32-NEXT:    stw r0, 120(r1)
864; AIX32-NEXT:    stw r30, 104(r1) # 4-byte Folded Spill
865; AIX32-NEXT:    lwz r30, L..C0(r2) # @__ModuleStringPool
866; AIX32-NEXT:    li r3, 372
867; AIX32-NEXT:    li r4, 360
868; AIX32-NEXT:    stw r31, 108(r1) # 4-byte Folded Spill
869; AIX32-NEXT:    lxvw4x vs0, r30, r3
870; AIX32-NEXT:    lxvw4x vs1, r30, r4
871; AIX32-NEXT:    li r4, 12
872; AIX32-NEXT:    addi r3, r1, 64
873; AIX32-NEXT:    rlwimi r4, r3, 0, 30, 27
874; AIX32-NEXT:    stxvw4x vs0, 0, r4
875; AIX32-NEXT:    stxvw4x vs1, 0, r3
876; AIX32-NEXT:    bl .calleeInt[PR]
877; AIX32-NEXT:    nop
878; AIX32-NEXT:    lwz r4, L..C3(r2) # @IntArray2
879; AIX32-NEXT:    mr r31, r3
880; AIX32-NEXT:    mr r3, r4
881; AIX32-NEXT:    bl .calleeInt[PR]
882; AIX32-NEXT:    nop
883; AIX32-NEXT:    addi r4, r30, 400
884; AIX32-NEXT:    mr r5, r3
885; AIX32-NEXT:    mr r3, r4
886; AIX32-NEXT:    add r31, r5, r31
887; AIX32-NEXT:    bl .callee[PR]
888; AIX32-NEXT:    nop
889; AIX32-NEXT:    addi r4, r30, 473
890; AIX32-NEXT:    mr r5, r3
891; AIX32-NEXT:    mr r3, r4
892; AIX32-NEXT:    add r31, r31, r5
893; AIX32-NEXT:    bl .callee[PR]
894; AIX32-NEXT:    nop
895; AIX32-NEXT:    add r3, r31, r3
896; AIX32-NEXT:    lwz r31, 108(r1) # 4-byte Folded Reload
897; AIX32-NEXT:    lwz r30, 104(r1) # 4-byte Folded Reload
898; AIX32-NEXT:    addi r1, r1, 112
899; AIX32-NEXT:    lwz r0, 8(r1)
900; AIX32-NEXT:    mtlr r0
901; AIX32-NEXT:    blr
902;
903; AIX64-LABEL: mixed2:
904; AIX64:       # %bb.0: # %entry
905; AIX64-NEXT:    mflr r0
906; AIX64-NEXT:    stdu r1, -160(r1)
907; AIX64-NEXT:    std r0, 176(r1)
908; AIX64-NEXT:    std r30, 144(r1) # 8-byte Folded Spill
909; AIX64-NEXT:    ld r30, L..C0(r2) # @__ModuleStringPool
910; AIX64-NEXT:    li r3, 372
911; AIX64-NEXT:    li r4, 360
912; AIX64-NEXT:    std r31, 152(r1) # 8-byte Folded Spill
913; AIX64-NEXT:    lxvw4x vs0, r30, r3
914; AIX64-NEXT:    lxvw4x vs1, r30, r4
915; AIX64-NEXT:    addi r4, r1, 124
916; AIX64-NEXT:    addi r3, r1, 112
917; AIX64-NEXT:    stxvw4x vs0, 0, r4
918; AIX64-NEXT:    stxvw4x vs1, 0, r3
919; AIX64-NEXT:    bl .calleeInt[PR]
920; AIX64-NEXT:    nop
921; AIX64-NEXT:    mr r31, r3
922; AIX64-NEXT:    ld r3, L..C3(r2) # @IntArray2
923; AIX64-NEXT:    bl .calleeInt[PR]
924; AIX64-NEXT:    nop
925; AIX64-NEXT:    addi r4, r30, 400
926; AIX64-NEXT:    add r31, r3, r31
927; AIX64-NEXT:    mr r3, r4
928; AIX64-NEXT:    bl .callee[PR]
929; AIX64-NEXT:    nop
930; AIX64-NEXT:    addi r4, r30, 473
931; AIX64-NEXT:    add r31, r31, r3
932; AIX64-NEXT:    mr r3, r4
933; AIX64-NEXT:    bl .callee[PR]
934; AIX64-NEXT:    nop
935; AIX64-NEXT:    add r3, r31, r3
936; AIX64-NEXT:    ld r31, 152(r1) # 8-byte Folded Reload
937; AIX64-NEXT:    ld r30, 144(r1) # 8-byte Folded Reload
938; AIX64-NEXT:    extsw r3, r3
939; AIX64-NEXT:    addi r1, r1, 160
940; AIX64-NEXT:    ld r0, 16(r1)
941; AIX64-NEXT:    mtlr r0
942; AIX64-NEXT:    blr
943;
944; LINUX64BE-LABEL: mixed2:
945; LINUX64BE:       # %bb.0: # %entry
946; LINUX64BE-NEXT:    mflr r0
947; LINUX64BE-NEXT:    stdu r1, -176(r1)
948; LINUX64BE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
949; LINUX64BE-NEXT:    std r0, 192(r1)
950; LINUX64BE-NEXT:    std r29, 152(r1) # 8-byte Folded Spill
951; LINUX64BE-NEXT:    li r4, 360
952; LINUX64BE-NEXT:    std r30, 160(r1) # 8-byte Folded Spill
953; LINUX64BE-NEXT:    addi r29, r3, .L__ModuleStringPool@toc@l
954; LINUX64BE-NEXT:    li r3, 372
955; LINUX64BE-NEXT:    lxvw4x vs0, r29, r3
956; LINUX64BE-NEXT:    addi r3, r1, 112
957; LINUX64BE-NEXT:    lxvw4x vs1, r29, r4
958; LINUX64BE-NEXT:    addi r4, r1, 124
959; LINUX64BE-NEXT:    stxvw4x vs0, 0, r4
960; LINUX64BE-NEXT:    stxvw4x vs1, 0, r3
961; LINUX64BE-NEXT:    bl calleeInt
962; LINUX64BE-NEXT:    nop
963; LINUX64BE-NEXT:    mr r30, r3
964; LINUX64BE-NEXT:    addis r3, r2, IntArray2@toc@ha
965; LINUX64BE-NEXT:    addi r3, r3, IntArray2@toc@l
966; LINUX64BE-NEXT:    bl calleeInt
967; LINUX64BE-NEXT:    nop
968; LINUX64BE-NEXT:    addi r4, r29, 400
969; LINUX64BE-NEXT:    add r30, r3, r30
970; LINUX64BE-NEXT:    mr r3, r4
971; LINUX64BE-NEXT:    bl callee
972; LINUX64BE-NEXT:    nop
973; LINUX64BE-NEXT:    addi r4, r29, 473
974; LINUX64BE-NEXT:    add r30, r30, r3
975; LINUX64BE-NEXT:    mr r3, r4
976; LINUX64BE-NEXT:    bl callee
977; LINUX64BE-NEXT:    nop
978; LINUX64BE-NEXT:    add r3, r30, r3
979; LINUX64BE-NEXT:    ld r30, 160(r1) # 8-byte Folded Reload
980; LINUX64BE-NEXT:    ld r29, 152(r1) # 8-byte Folded Reload
981; LINUX64BE-NEXT:    extsw r3, r3
982; LINUX64BE-NEXT:    addi r1, r1, 176
983; LINUX64BE-NEXT:    ld r0, 16(r1)
984; LINUX64BE-NEXT:    mtlr r0
985; LINUX64BE-NEXT:    blr
986;
987; LINUX64LE-LABEL: mixed2:
988; LINUX64LE:       # %bb.0: # %entry
989; LINUX64LE-NEXT:    mflr r0
990; LINUX64LE-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
991; LINUX64LE-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
992; LINUX64LE-NEXT:    stdu r1, -96(r1)
993; LINUX64LE-NEXT:    addis r3, r2, .L__ModuleStringPool@toc@ha
994; LINUX64LE-NEXT:    li r4, 360
995; LINUX64LE-NEXT:    std r0, 112(r1)
996; LINUX64LE-NEXT:    addi r29, r3, .L__ModuleStringPool@toc@l
997; LINUX64LE-NEXT:    li r3, 372
998; LINUX64LE-NEXT:    lxvd2x vs0, r29, r3
999; LINUX64LE-NEXT:    lxvd2x vs1, r29, r4
1000; LINUX64LE-NEXT:    addi r4, r1, 44
1001; LINUX64LE-NEXT:    addi r3, r1, 32
1002; LINUX64LE-NEXT:    stxvd2x vs0, 0, r4
1003; LINUX64LE-NEXT:    stxvd2x vs1, 0, r3
1004; LINUX64LE-NEXT:    bl calleeInt
1005; LINUX64LE-NEXT:    nop
1006; LINUX64LE-NEXT:    mr r30, r3
1007; LINUX64LE-NEXT:    addis r3, r2, IntArray2@toc@ha
1008; LINUX64LE-NEXT:    addi r3, r3, IntArray2@toc@l
1009; LINUX64LE-NEXT:    bl calleeInt
1010; LINUX64LE-NEXT:    nop
1011; LINUX64LE-NEXT:    addi r4, r29, 400
1012; LINUX64LE-NEXT:    add r30, r3, r30
1013; LINUX64LE-NEXT:    mr r3, r4
1014; LINUX64LE-NEXT:    bl callee
1015; LINUX64LE-NEXT:    nop
1016; LINUX64LE-NEXT:    addi r4, r29, 473
1017; LINUX64LE-NEXT:    add r30, r30, r3
1018; LINUX64LE-NEXT:    mr r3, r4
1019; LINUX64LE-NEXT:    bl callee
1020; LINUX64LE-NEXT:    nop
1021; LINUX64LE-NEXT:    add r3, r30, r3
1022; LINUX64LE-NEXT:    extsw r3, r3
1023; LINUX64LE-NEXT:    addi r1, r1, 96
1024; LINUX64LE-NEXT:    ld r0, 16(r1)
1025; LINUX64LE-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1026; LINUX64LE-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
1027; LINUX64LE-NEXT:    mtlr r0
1028; LINUX64LE-NEXT:    blr
1029entry:
1030  %IntArray = alloca [7 x i32], align 4
1031  call void @llvm.lifetime.start.p0(i64 28, ptr nonnull %IntArray)
1032  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(28) %IntArray, ptr noundef nonnull align 4 dereferenceable(28) @__const.mixed2.IntArray, i64 28, i1 false)
1033  %call = call signext i32 @calleeInt(ptr noundef nonnull %IntArray)
1034  %call1 = call signext i32 @calleeInt(ptr noundef nonnull @IntArray2)
1035  %add = add nsw i32 %call1, %call
1036  %call2 = call signext i32 @callee(ptr noundef nonnull @.str.6)
1037  %add3 = add nsw i32 %add, %call2
1038  %call4 = call signext i32 @callee(ptr noundef nonnull @.str.7)
1039  %add5 = add nsw i32 %add3, %call4
1040  call void @llvm.lifetime.end.p0(i64 28, ptr nonnull %IntArray)
1041  ret i32 %add5
1042}
1043
1044define dso_local signext i32 @str9() local_unnamed_addr #0 {
1045; AIX32-LABEL: str9:
1046; AIX32:       # %bb.0: # %entry
1047; AIX32-NEXT:    mflr r0
1048; AIX32-NEXT:    stwu r1, -64(r1)
1049; AIX32-NEXT:    lwz r3, L..C4(r2) # @.str.9
1050; AIX32-NEXT:    stw r0, 72(r1)
1051; AIX32-NEXT:    bl .callee[PR]
1052; AIX32-NEXT:    nop
1053; AIX32-NEXT:    addi r1, r1, 64
1054; AIX32-NEXT:    lwz r0, 8(r1)
1055; AIX32-NEXT:    mtlr r0
1056; AIX32-NEXT:    blr
1057;
1058; AIX64-LABEL: str9:
1059; AIX64:       # %bb.0: # %entry
1060; AIX64-NEXT:    mflr r0
1061; AIX64-NEXT:    stdu r1, -112(r1)
1062; AIX64-NEXT:    ld r3, L..C4(r2) # @.str.9
1063; AIX64-NEXT:    std r0, 128(r1)
1064; AIX64-NEXT:    bl .callee[PR]
1065; AIX64-NEXT:    nop
1066; AIX64-NEXT:    addi r1, r1, 112
1067; AIX64-NEXT:    ld r0, 16(r1)
1068; AIX64-NEXT:    mtlr r0
1069; AIX64-NEXT:    blr
1070;
1071; LINUX64BE-LABEL: str9:
1072; LINUX64BE:       # %bb.0: # %entry
1073; LINUX64BE-NEXT:    mflr r0
1074; LINUX64BE-NEXT:    stdu r1, -112(r1)
1075; LINUX64BE-NEXT:    addis r3, r2, .L.str.9@toc@ha
1076; LINUX64BE-NEXT:    std r0, 128(r1)
1077; LINUX64BE-NEXT:    addi r3, r3, .L.str.9@toc@l
1078; LINUX64BE-NEXT:    bl callee
1079; LINUX64BE-NEXT:    nop
1080; LINUX64BE-NEXT:    addi r1, r1, 112
1081; LINUX64BE-NEXT:    ld r0, 16(r1)
1082; LINUX64BE-NEXT:    mtlr r0
1083; LINUX64BE-NEXT:    blr
1084;
1085; LINUX64LE-LABEL: str9:
1086; LINUX64LE:       # %bb.0: # %entry
1087; LINUX64LE-NEXT:    mflr r0
1088; LINUX64LE-NEXT:    stdu r1, -32(r1)
1089; LINUX64LE-NEXT:    addis r3, r2, .L.str.9@toc@ha
1090; LINUX64LE-NEXT:    std r0, 48(r1)
1091; LINUX64LE-NEXT:    addi r3, r3, .L.str.9@toc@l
1092; LINUX64LE-NEXT:    bl callee
1093; LINUX64LE-NEXT:    nop
1094; LINUX64LE-NEXT:    addi r1, r1, 32
1095; LINUX64LE-NEXT:    ld r0, 16(r1)
1096; LINUX64LE-NEXT:    mtlr r0
1097; LINUX64LE-NEXT:    blr
1098entry:
1099  %call = tail call signext i32 @callee(ptr noundef nonnull @.str.9)
1100  ret i32 %call
1101}
1102
1103define dso_local signext i32 @str10() local_unnamed_addr #0 {
1104; AIX32-LABEL: str10:
1105; AIX32:       # %bb.0: # %entry
1106; AIX32-NEXT:    mflr r0
1107; AIX32-NEXT:    stwu r1, -64(r1)
1108; AIX32-NEXT:    lwz r3, L..C5(r2) # @.str.10
1109; AIX32-NEXT:    stw r0, 72(r1)
1110; AIX32-NEXT:    bl .callee[PR]
1111; AIX32-NEXT:    nop
1112; AIX32-NEXT:    addi r1, r1, 64
1113; AIX32-NEXT:    lwz r0, 8(r1)
1114; AIX32-NEXT:    mtlr r0
1115; AIX32-NEXT:    blr
1116;
1117; AIX64-LABEL: str10:
1118; AIX64:       # %bb.0: # %entry
1119; AIX64-NEXT:    mflr r0
1120; AIX64-NEXT:    stdu r1, -112(r1)
1121; AIX64-NEXT:    ld r3, L..C5(r2) # @.str.10
1122; AIX64-NEXT:    std r0, 128(r1)
1123; AIX64-NEXT:    bl .callee[PR]
1124; AIX64-NEXT:    nop
1125; AIX64-NEXT:    addi r1, r1, 112
1126; AIX64-NEXT:    ld r0, 16(r1)
1127; AIX64-NEXT:    mtlr r0
1128; AIX64-NEXT:    blr
1129;
1130; LINUX64BE-LABEL: str10:
1131; LINUX64BE:       # %bb.0: # %entry
1132; LINUX64BE-NEXT:    mflr r0
1133; LINUX64BE-NEXT:    stdu r1, -112(r1)
1134; LINUX64BE-NEXT:    addis r3, r2, .L.str.10@toc@ha
1135; LINUX64BE-NEXT:    std r0, 128(r1)
1136; LINUX64BE-NEXT:    addi r3, r3, .L.str.10@toc@l
1137; LINUX64BE-NEXT:    bl callee
1138; LINUX64BE-NEXT:    nop
1139; LINUX64BE-NEXT:    addi r1, r1, 112
1140; LINUX64BE-NEXT:    ld r0, 16(r1)
1141; LINUX64BE-NEXT:    mtlr r0
1142; LINUX64BE-NEXT:    blr
1143;
1144; LINUX64LE-LABEL: str10:
1145; LINUX64LE:       # %bb.0: # %entry
1146; LINUX64LE-NEXT:    mflr r0
1147; LINUX64LE-NEXT:    stdu r1, -32(r1)
1148; LINUX64LE-NEXT:    addis r3, r2, .L.str.10@toc@ha
1149; LINUX64LE-NEXT:    std r0, 48(r1)
1150; LINUX64LE-NEXT:    addi r3, r3, .L.str.10@toc@l
1151; LINUX64LE-NEXT:    bl callee
1152; LINUX64LE-NEXT:    nop
1153; LINUX64LE-NEXT:    addi r1, r1, 32
1154; LINUX64LE-NEXT:    ld r0, 16(r1)
1155; LINUX64LE-NEXT:    mtlr r0
1156; LINUX64LE-NEXT:    blr
1157entry:
1158  %call = tail call signext i32 @callee(ptr noundef nonnull @.str.10)
1159  ret i32 %call
1160}
1161
1162attributes #0 = { nounwind }
1163
1164; AIXDATA: .csect L..__ModuleStringPool[RO],2
1165; AIXDATA:       .align  3                               # @__ModuleStringPool
1166; AIXDATA:       .vbyte  4, 5                            # 0x5
1167; AIXDATA:       .vbyte  4, 7                            # 0x7
1168; AIXDATA:       .vbyte  4, 9                            # 0x9
1169; AIXDATA:       .vbyte  4, 11                           # 0xb
1170; AIXDATA:       .vbyte  4, 17                           # 0x11
1171; AIXDATA:       .vbyte  4, 1235                         # 0x4d3
1172; AIXDATA:       .vbyte  4, 32                           # 0x20
1173; AIXDATA:       .string "str2_STRING"
1174; AIXDATA:       .string "MixedString"
1175; AIXDATA:       .string "ABCABCABC"
1176; AIXDATA:       .string "str1_STRING"
1177; AIXDATA:       .string "str3_STRING"
1178; AIXDATA:       .string "str4_STRING"
1179; AIXDATA:       .byte   'S,'t,'a,'t,'i,'c,' ,'G,'l,'o,'b,'a,'l,0012,0000
1180; AIXDATA:       .string "Different String 01"
1181; AIXDATA:       .string "longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_STRING"
1182
1183; LINUXDATA: .L__ModuleStringPool:
1184; LINUXDATA:    .long	5                               # 0x5
1185; LINUXDATA:    .long	7                               # 0x7
1186; LINUXDATA:    .long	9                               # 0x9
1187; LINUXDATA:    .long	11                              # 0xb
1188; LINUXDATA:    .long	17                              # 0x11
1189; LINUXDATA:    .long	1235                            # 0x4d3
1190; LINUXDATA:    .long	32                              # 0x20
1191; LINUXDATA:    .asciz	"str2_STRING"
1192; LINUXDATA:    .asciz	"MixedString"
1193; LINUXDATA:    .asciz	"ABCABCABC"
1194; LINUXDATA:    .asciz	"str1_STRING"
1195; LINUXDATA:    .asciz	"str3_STRING"
1196; LINUXDATA:    .asciz	"str4_STRING"
1197; LINUXDATA:    .asciz	"Static Global\n"
1198; LINUXDATA:    .asciz	"Different String 01"
1199; LINUXDATA:    .asciz	"longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_longerstr5_STRING"
1200