blob: fa899b5b30167ee6bf140d72e562aefd05e6a592 [file] [log] [blame]
Joerg Sonnenberger400e7b72016-12-15 00:01:53 +00001; RUN: llc -relocation-model=static -verify-machineinstrs -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
Joerg Sonnenberger400e7b72016-12-15 00:01:53 +00003; RUN: llc -relocation-model=static -verify-machineinstrs -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.
Joerg Sonnenberger400e7b72016-12-15 00:01:53 +00007; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 -code-model=medium -filetype=obj -fast-isel=false %s -o - | \
Hans Wennborg0867b152015-04-23 16:45:24 +00008; RUN: llvm-readobj -r | FileCheck -check-prefix=MEDIUM-JT %s
Joerg Sonnenberger400e7b72016-12-15 00:01:53 +00009; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 -code-model=large -filetype=obj -fast-isel=false %s -o - | \
Hans Wennborg0867b152015-04-23 16:45:24 +000010; 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
Rafael Espindola82149a12017-01-26 15:02:31 +0000111; Verify generation of relocations foraccessing variable ti.
Hans Wennborg0867b152015-04-23 16:45:24 +0000112;
113; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM6:[^ ]+]]
Rafael Espindola82149a12017-01-26 15:02:31 +0000114; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM6]]
Hans Wennborg0867b152015-04-23 16:45:24 +0000115;
116; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM6:[^ ]+]]
117; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM6]]
118
119define i8* @test_fnaddr() nounwind {
120entry:
121 %func = alloca i32 (i32)*, align 8
122 store i32 (i32)* @foo, i32 (i32)** %func, align 8
123 %0 = load i32 (i32)*, i32 (i32)** %func, align 8
124 %1 = bitcast i32 (i32)* %0 to i8*
125 ret i8* %1
126}
127
128declare signext i32 @foo(i32 signext)
129
130; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
131; accessing function address foo.
132;
133; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM7:[^ ]+]]
134; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM7]]
135;
136; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM7:[^ ]+]]
137; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM7]]
138
139
Bill Schmidt34627e32012-11-27 17:35:46 +0000140define signext i32 @test_jump_table(i32 signext %i) nounwind {
141entry:
142 %i.addr = alloca i32, align 4
143 store i32 %i, i32* %i.addr, align 4
David Blaikiea79ac142015-02-27 21:17:42 +0000144 %0 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000145 switch i32 %0, label %sw.default [
146 i32 3, label %sw.bb
147 i32 4, label %sw.bb1
148 i32 5, label %sw.bb2
149 i32 6, label %sw.bb3
150 ]
151
152sw.default: ; preds = %entry
153 br label %sw.epilog
154
155sw.bb: ; preds = %entry
David Blaikiea79ac142015-02-27 21:17:42 +0000156 %1 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000157 %mul = mul nsw i32 %1, 7
158 store i32 %mul, i32* %i.addr, align 4
159 br label %sw.bb1
160
161sw.bb1: ; preds = %entry, %sw.bb
David Blaikiea79ac142015-02-27 21:17:42 +0000162 %2 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000163 %dec = add nsw i32 %2, -1
164 store i32 %dec, i32* %i.addr, align 4
165 br label %sw.bb2
166
167sw.bb2: ; preds = %entry, %sw.bb1
David Blaikiea79ac142015-02-27 21:17:42 +0000168 %3 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000169 %add = add nsw i32 %3, 3
170 store i32 %add, i32* %i.addr, align 4
171 br label %sw.bb3
172
173sw.bb3: ; preds = %entry, %sw.bb2
David Blaikiea79ac142015-02-27 21:17:42 +0000174 %4 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000175 %shl = shl i32 %4, 1
176 store i32 %shl, i32* %i.addr, align 4
177 br label %sw.epilog
178
179sw.epilog: ; preds = %sw.bb3, %sw.default
David Blaikiea79ac142015-02-27 21:17:42 +0000180 %5 = load i32, i32* %i.addr, align 4
Bill Schmidt34627e32012-11-27 17:35:46 +0000181 ret i32 %5
182}
183
184; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for
185; accessing a jump table address.
186;
Hans Wennborg0867b152015-04-23 16:45:24 +0000187; MEDIUM-JT: Relocations [
188; MEDIUM-JT: Section ({{.*}}) .rela.text {
189; MEDIUM-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM:[^ ]+]]
190; MEDIUM-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM]]
Bill Schmidt27917782013-02-21 17:12:27 +0000191;
Hans Wennborg0867b152015-04-23 16:45:24 +0000192; LARGE-JT: Relocations [
193; LARGE-JT: Section ({{.*}}) .rela.text {
194; LARGE-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM:[^ ]+]]
195; LARGE-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM]]