blob: 1ececf84926e6bd807c769dcadbced4b1bd3fba6 [file] [log] [blame]
Bill Schmidt4a28e822013-06-13 20:23:34 +00001; RUN: llc -O0 -mcpu=pwr7 -code-model=medium -filetype=obj -fast-isel=false %s -o - | \
Nico Rieckba848e32013-04-12 04:06:46 +00002; RUN: llvm-readobj -r | FileCheck -check-prefix=MEDIUM %s
Bill Schmidt4a28e822013-06-13 20:23:34 +00003; RUN: llc -O0 -mcpu=pwr7 -code-model=large -filetype=obj -fast-isel=false %s -o - | \
Nico Rieckba848e32013-04-12 04:06:46 +00004; RUN: llvm-readobj -r | FileCheck -check-prefix=LARGE %s
Bill Schmidt34627e32012-11-27 17:35:46 +00005
Hans Wennborg0867b152015-04-23 16:45:24 +00006; Run jump table test separately since jump tables aren't generated at -O0.
7; RUN: llc -mcpu=pwr7 -code-model=medium -filetype=obj -fast-isel=false %s -o - | \
8; RUN: llvm-readobj -r | FileCheck -check-prefix=MEDIUM-JT %s
9; RUN: llc -mcpu=pwr7 -code-model=large -filetype=obj -fast-isel=false %s -o - | \
10; RUN: llvm-readobj -r | FileCheck -check-prefix=LARGE-JT %s
11
Bill Schmidt34627e32012-11-27 17:35:46 +000012; FIXME: When asm-parse is available, could make this an assembly test.
13
14target 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-f128:128:128-v128:128:128-n32:64"
15target triple = "powerpc64-unknown-linux-gnu"
16
17@ei = external global i32
18
19define signext i32 @test_external() nounwind {
20entry:
David Blaikiea79ac142015-02-27 21:17:42 +000021 %0 = load i32, i32* @ei, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +000022 %inc = add nsw i32 %0, 1
23 store i32 %inc, i32* @ei, align 4
24 ret i32 %0
25}
26
27; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
28; accessing external variable ei.
29;
Nico Rieckba848e32013-04-12 04:06:46 +000030; MEDIUM: Relocations [
Rafael Espindola10f3de62015-04-15 15:59:37 +000031; MEDIUM: Section {{.*}} .rela.text {
Nico Rieckba848e32013-04-12 04:06:46 +000032; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM1:[^ ]+]]
33; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM1]]
Bill Schmidt27917782013-02-21 17:12:27 +000034;
Nico Rieckba848e32013-04-12 04:06:46 +000035; LARGE: Relocations [
Rafael Espindola10f3de62015-04-15 15:59:37 +000036; LARGE: Section {{.*}} .rela.text {
Nico Rieckba848e32013-04-12 04:06:46 +000037; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM1:[^ ]+]]
38; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM1]]
Bill Schmidt34627e32012-11-27 17:35:46 +000039
40@test_fn_static.si = internal global i32 0, align 4
41
42define signext i32 @test_fn_static() nounwind {
43entry:
David Blaikiea79ac142015-02-27 21:17:42 +000044 %0 = load i32, i32* @test_fn_static.si, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +000045 %inc = add nsw i32 %0, 1
46 store i32 %inc, i32* @test_fn_static.si, align 4
47 ret i32 %0
48}
49
50; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for
51; accessing function-scoped variable si.
52;
Nico Rieckba848e32013-04-12 04:06:46 +000053; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM2:[^ ]+]]
54; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM2]]
Bill Schmidt27917782013-02-21 17:12:27 +000055;
56; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
57; accessing function-scoped variable si.
58;
Nico Rieckba848e32013-04-12 04:06:46 +000059; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM2:[^ ]+]]
60; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM2]]
Bill Schmidt34627e32012-11-27 17:35:46 +000061
62@gi = global i32 5, align 4
63
64define signext i32 @test_file_static() nounwind {
65entry:
David Blaikiea79ac142015-02-27 21:17:42 +000066 %0 = load i32, i32* @gi, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +000067 %inc = add nsw i32 %0, 1
68 store i32 %inc, i32* @gi, align 4
69 ret i32 %0
70}
71
72; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for
73; accessing file-scope variable gi.
74;
Nico Rieckba848e32013-04-12 04:06:46 +000075; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM3:[^ ]+]]
76; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM3]]
Bill Schmidt27917782013-02-21 17:12:27 +000077;
78; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
79; accessing file-scope variable gi.
80;
Nico Rieckba848e32013-04-12 04:06:46 +000081; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM3:[^ ]+]]
82; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM3]]
Bill Schmidt34627e32012-11-27 17:35:46 +000083
84define double @test_double_const() nounwind {
85entry:
86 ret double 0x3F4FD4920B498CF0
87}
88
89; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for
90; accessing a constant.
91;
Nico Rieckba848e32013-04-12 04:06:46 +000092; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM4:[^ ]+]]
93; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM4]]
Bill Schmidt27917782013-02-21 17:12:27 +000094;
95; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
96; accessing a constant.
97;
Nico Rieckba848e32013-04-12 04:06:46 +000098; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM4:[^ ]+]]
99; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM4]]
Bill Schmidt34627e32012-11-27 17:35:46 +0000100
Hans Wennborg0867b152015-04-23 16:45:24 +0000101@ti = common global i32 0, align 4
102
103define signext i32 @test_tentative() nounwind {
104entry:
105 %0 = load i32, i32* @ti, align 4
106 %inc = add nsw i32 %0, 1
107 store i32 %inc, i32* @ti, align 4
108 ret i32 %0
109}
110
111; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
112; accessing tentatively declared variable ti.
113;
114; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM6:[^ ]+]]
115; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM6]]
116;
117; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM6:[^ ]+]]
118; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM6]]
119
120define i8* @test_fnaddr() nounwind {
121entry:
122 %func = alloca i32 (i32)*, align 8
123 store i32 (i32)* @foo, i32 (i32)** %func, align 8
124 %0 = load i32 (i32)*, i32 (i32)** %func, align 8
125 %1 = bitcast i32 (i32)* %0 to i8*
126 ret i8* %1
127}
128
129declare signext i32 @foo(i32 signext)
130
131; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
132; accessing function address foo.
133;
134; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM7:[^ ]+]]
135; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM7]]
136;
137; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM7:[^ ]+]]
138; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM7]]
139
140
Bill Schmidt34627e32012-11-27 17:35:46 +0000141define signext i32 @test_jump_table(i32 signext %i) nounwind {
142entry:
143 %i.addr = alloca i32, align 4
144 store i32 %i, i32* %i.addr, align 4
David Blaikiea79ac142015-02-27 21:17:42 +0000145 %0 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000146 switch i32 %0, label %sw.default [
147 i32 3, label %sw.bb
148 i32 4, label %sw.bb1
149 i32 5, label %sw.bb2
150 i32 6, label %sw.bb3
151 ]
152
153sw.default: ; preds = %entry
154 br label %sw.epilog
155
156sw.bb: ; preds = %entry
David Blaikiea79ac142015-02-27 21:17:42 +0000157 %1 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000158 %mul = mul nsw i32 %1, 7
159 store i32 %mul, i32* %i.addr, align 4
160 br label %sw.bb1
161
162sw.bb1: ; preds = %entry, %sw.bb
David Blaikiea79ac142015-02-27 21:17:42 +0000163 %2 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000164 %dec = add nsw i32 %2, -1
165 store i32 %dec, i32* %i.addr, align 4
166 br label %sw.bb2
167
168sw.bb2: ; preds = %entry, %sw.bb1
David Blaikiea79ac142015-02-27 21:17:42 +0000169 %3 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000170 %add = add nsw i32 %3, 3
171 store i32 %add, i32* %i.addr, align 4
172 br label %sw.bb3
173
174sw.bb3: ; preds = %entry, %sw.bb2
David Blaikiea79ac142015-02-27 21:17:42 +0000175 %4 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000176 %shl = shl i32 %4, 1
177 store i32 %shl, i32* %i.addr, align 4
178 br label %sw.epilog
179
180sw.epilog: ; preds = %sw.bb3, %sw.default
David Blaikiea79ac142015-02-27 21:17:42 +0000181 %5 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000182 ret i32 %5
183}
184
185; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
186; accessing a jump table address.
187;
Hans Wennborg0867b152015-04-23 16:45:24 +0000188; MEDIUM-JT: Relocations [
189; MEDIUM-JT: Section ({{.*}}) .rela.text {
190; MEDIUM-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM:[^ ]+]]
191; MEDIUM-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM]]
Bill Schmidt27917782013-02-21 17:12:27 +0000192;
Hans Wennborg0867b152015-04-23 16:45:24 +0000193; LARGE-JT: Relocations [
194; LARGE-JT: Section ({{.*}}) .rela.text {
195; LARGE-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM:[^ ]+]]
196; LARGE-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM]]