blob: 4e8f75e8d32d273aeae51a14f22ee1863e574bcc [file] [log] [blame]
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s
JF Bastien45479f62015-08-26 22:09:54 +00002
3; Test that globals assemble as expected.
4
Dan Gohman0c6f5ac2016-01-07 03:19:23 +00005target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
Sam Clegga5908002018-05-10 17:49:11 +00006target triple = "wasm32-unknown-unknown"
JF Bastien45479f62015-08-26 22:09:54 +00007
8; CHECK-NOT: llvm.used
9; CHECK-NOT: llvm.metadata
10@llvm.used = appending global [1 x i32*] [i32* @g], section "llvm.metadata"
11
Derek Schuff71e81692015-11-17 00:20:44 +000012; CHECK: foo:
Dan Gohman4b9d7912015-12-15 22:01:29 +000013; CHECK: i32.const $push0=, 0{{$}}
14; CHECK-NEXT: i32.load $push1=, answer($pop0){{$}}
Dan Gohman81719f82015-11-25 16:55:01 +000015; CHECK-NEXT: return $pop1{{$}}
Derek Schuff71e81692015-11-17 00:20:44 +000016define i32 @foo() {
17 %a = load i32, i32* @answer
18 ret i32 %a
19}
20
Dan Gohman2c8fe6a2015-11-25 16:44:29 +000021; CHECK-LABEL: call_memcpy:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000022; CHECK-NEXT: .functype call_memcpy (i32, i32, i32) -> (i32){{$}}
Dan Gohmanbdf08d52016-01-26 04:01:11 +000023; CHECK-NEXT: i32.call $push0=, memcpy@FUNCTION, $0, $1, $2{{$}}
24; CHECK-NEXT: return $pop0{{$}}
Daniel Neilson1e687242018-01-19 17:13:12 +000025declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i1)
Dan Gohman2c8fe6a2015-11-25 16:44:29 +000026define i8* @call_memcpy(i8* %p, i8* nocapture readonly %q, i32 %n) {
Daniel Neilson1e687242018-01-19 17:13:12 +000027 tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %p, i8* %q, i32 %n, i1 false)
Dan Gohman2c8fe6a2015-11-25 16:44:29 +000028 ret i8* %p
29}
30
Dan Gohman0c6f5ac2016-01-07 03:19:23 +000031; CHECK: .type .Lg,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +000032; CHECK: .p2align 2{{$}}
Dan Gohman0c6f5ac2016-01-07 03:19:23 +000033; CHECK-NEXT: .Lg:
Dan Gohmane51c0582015-10-06 00:27:55 +000034; CHECK-NEXT: .int32 1337{{$}}
Dan Gohman0c6f5ac2016-01-07 03:19:23 +000035; CHECK-NEXT: .size .Lg, 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000036@g = private global i32 1337
JF Bastien45479f62015-08-26 22:09:54 +000037
Dan Gohmane51c0582015-10-06 00:27:55 +000038; CHECK-LABEL: ud:
JF Bastienb9ec4c62016-01-07 23:18:29 +000039; CHECK-NEXT: .skip 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000040; CHECK-NEXT: .size ud, 4{{$}}
41@ud = internal global i32 undef
JF Bastien45479f62015-08-26 22:09:54 +000042
Dan Gohmane51c0582015-10-06 00:27:55 +000043; CHECK: .type nil,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +000044; CHECK: .p2align 2
45; CHECK: nil:
46; CHECK: .int32 0
47; CHECK: .size nil, 4
Dan Gohmane51c0582015-10-06 00:27:55 +000048@nil = internal global i32 zeroinitializer
JF Bastien45479f62015-08-26 22:09:54 +000049
Dan Gohmane51c0582015-10-06 00:27:55 +000050; CHECK: .type z,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +000051; CHECK: .p2align 2
52; CHECK: z:
53; CHECK: .int32 0
54; CHECK: .size z, 4
Dan Gohmane51c0582015-10-06 00:27:55 +000055@z = internal global i32 0
JF Bastien45479f62015-08-26 22:09:54 +000056
Dan Gohman7d7409e2017-02-28 23:37:04 +000057; CHECK: .type one,@object
58; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000059; CHECK-NEXT: one:
60; CHECK-NEXT: .int32 1{{$}}
61; CHECK-NEXT: .size one, 4{{$}}
62@one = internal global i32 1
63
64; CHECK: .type answer,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +000065; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000066; CHECK-NEXT: answer:
67; CHECK-NEXT: .int32 42{{$}}
68; CHECK-NEXT: .size answer, 4{{$}}
69@answer = internal global i32 42
70
71; CHECK: .type u32max,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +000072; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000073; CHECK-NEXT: u32max:
74; CHECK-NEXT: .int32 4294967295{{$}}
75; CHECK-NEXT: .size u32max, 4{{$}}
76@u32max = internal global i32 -1
77
78; CHECK: .type ud64,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +000079; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000080; CHECK-NEXT: ud64:
JF Bastienb9ec4c62016-01-07 23:18:29 +000081; CHECK-NEXT: .skip 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000082; CHECK-NEXT: .size ud64, 8{{$}}
83@ud64 = internal global i64 undef
84
85; CHECK: .type nil64,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +000086; CHECK: .p2align 3{{$}}
87; CHECK-NEXT: nil64:
88; CHECK-NEXT: .int64 0{{$}}
89; CHECK-NEXT: .size nil64, 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000090@nil64 = internal global i64 zeroinitializer
91
92; CHECK: .type z64,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +000093; CHECK: .p2align 3{{$}}
94; CHECK-NEXT: z64:
95; CHECK-NEXT: .int64 0{{$}}
96; CHECK-NEXT: .size z64, 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000097@z64 = internal global i64 0
98
99; CHECK: .type twoP32,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000100; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000101; CHECK-NEXT: twoP32:
102; CHECK-NEXT: .int64 4294967296{{$}}
103; CHECK-NEXT: .size twoP32, 8{{$}}
104@twoP32 = internal global i64 4294967296
105
106; CHECK: .type u64max,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000107; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000108; CHECK-NEXT: u64max:
109; CHECK-NEXT: .int64 -1{{$}}
110; CHECK-NEXT: .size u64max, 8{{$}}
111@u64max = internal global i64 -1
112
113; CHECK: .type f32ud,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000114; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000115; CHECK-NEXT: f32ud:
JF Bastienb9ec4c62016-01-07 23:18:29 +0000116; CHECK-NEXT: .skip 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000117; CHECK-NEXT: .size f32ud, 4{{$}}
118@f32ud = internal global float undef
119
120; CHECK: .type f32nil,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000121; CHECK: .p2align 2{{$}}
122; CHECK-NEXT: f32nil:
123; CHECK-NEXT: .int32 0{{$}}
124; CHECK-NEXT: .size f32nil, 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000125@f32nil = internal global float zeroinitializer
126
127; CHECK: .type f32z,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000128; CHECK: .p2align 2{{$}}
129; CHECK-NEXT: f32z:
130; CHECK-NEXT: .int32 0{{$}}
131; CHECK-NEXT: .size f32z, 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000132@f32z = internal global float 0.0
133
134; CHECK: .type f32nz,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000135; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000136; CHECK: f32nz:
137; CHECK: .int32 2147483648{{$}}
138; CHECK: .size f32nz, 4{{$}}
139@f32nz = internal global float -0.0
140
141; CHECK: .type f32two,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000142; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000143; CHECK-NEXT: f32two:
144; CHECK-NEXT: .int32 1073741824{{$}}
145; CHECK-NEXT: .size f32two, 4{{$}}
146@f32two = internal global float 2.0
147
148; CHECK: .type f64ud,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000149; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000150; CHECK-NEXT: f64ud:
JF Bastienb9ec4c62016-01-07 23:18:29 +0000151; CHECK-NEXT: .skip 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000152; CHECK-NEXT: .size f64ud, 8{{$}}
153@f64ud = internal global double undef
154
155; CHECK: .type f64nil,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000156; CHECK: .p2align 3{{$}}
157; CHECK-NEXT: f64nil:
158; CHECK-NEXT: .int64 0{{$}}
159; CHECK-NEXT: .size f64nil, 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000160@f64nil = internal global double zeroinitializer
161
162; CHECK: .type f64z,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000163; CHECK: .p2align 3{{$}}
164; CHECK-NEXT: f64z:
165; CHECK-NEXT: .int64 0{{$}}
166; CHECK-NEXT: .size f64z, 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000167@f64z = internal global double 0.0
168
169; CHECK: .type f64nz,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000170; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000171; CHECK-NEXT: f64nz:
172; CHECK-NEXT: .int64 -9223372036854775808{{$}}
173; CHECK-NEXT: .size f64nz, 8{{$}}
174@f64nz = internal global double -0.0
175
176; CHECK: .type f64two,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000177; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000178; CHECK-NEXT: f64two:
179; CHECK-NEXT: .int64 4611686018427387904{{$}}
180; CHECK-NEXT: .size f64two, 8{{$}}
181@f64two = internal global double 2.0
JF Bastien65f0a712015-12-15 02:02:51 +0000182
183; Indexing into a global array produces a relocation.
184; CHECK: .type arr,@object
185; CHECK: .type ptr,@object
186; CHECK: ptr:
187; CHECK-NEXT: .int32 arr+80
188; CHECK-NEXT: .size ptr, 4
189@arr = global [128 x i32] zeroinitializer, align 16
190@ptr = global i32* getelementptr inbounds ([128 x i32], [128 x i32]* @arr, i32 0, i32 20), align 4
Dan Gohman670a60e2015-12-17 20:50:45 +0000191
192; Constant global.
193; CHECK: .type rom,@object{{$}}
Dan Gohman7d7409e2017-02-28 23:37:04 +0000194; CHECK: .section .rodata.rom,
Dan Gohman670a60e2015-12-17 20:50:45 +0000195; CHECK: .globl rom{{$}}
Dan Gohman61d15ae2016-01-26 00:03:25 +0000196; CHECK: .p2align 4{{$}}
Dan Gohman670a60e2015-12-17 20:50:45 +0000197; CHECK: rom:
JF Bastienb9ec4c62016-01-07 23:18:29 +0000198; CHECK: .skip 512{{$}}
Dan Gohman670a60e2015-12-17 20:50:45 +0000199; CHECK: .size rom, 512{{$}}
200@rom = constant [128 x i32] zeroinitializer, align 16
Dan Gohman938ff9f2016-01-13 19:29:37 +0000201
202; CHECK: .type array,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000203; CHECK: array:
Dan Gohman938ff9f2016-01-13 19:29:37 +0000204; CHECK-NEXT: .skip 8
205; CHECK-NEXT: .size array, 8
206; CHECK: .type pointer_to_array,@object
Sam Clegg74f5fd42018-11-16 18:59:51 +0000207; CHECK-NEXT: .section .rodata.pointer_to_array,
Dan Gohman938ff9f2016-01-13 19:29:37 +0000208; CHECK-NEXT: .globl pointer_to_array
Dan Gohman61d15ae2016-01-26 00:03:25 +0000209; CHECK-NEXT: .p2align 2
Dan Gohman938ff9f2016-01-13 19:29:37 +0000210; CHECK-NEXT: pointer_to_array:
211; CHECK-NEXT: .int32 array+4
212; CHECK-NEXT: .size pointer_to_array, 4
213@array = internal constant [8 x i8] zeroinitializer, align 1
214@pointer_to_array = constant i8* getelementptr inbounds ([8 x i8], [8 x i8]* @array, i32 0, i32 4), align 4
Dan Gohman5cf64732017-12-07 00:14:30 +0000215
216; Handle external objects with opaque type.
217%struct.ASTRUCT = type opaque
218@g_struct = external global %struct.ASTRUCT, align 1
219define i32 @address_of_opaque() {
220 ret i32 ptrtoint (%struct.ASTRUCT* @g_struct to i32)
221}