@@ -41,7 +41,8 @@ target triple = "x86_64--linux"
41
41
@extern_data = external global [10 x i32 ], align 16
42
42
@thread_data = external thread_local global i32 , align 4
43
43
@unknown_size_data = dso_local global [0 x i32 ] zeroinitializer , align 16
44
-
44
+ @forced_small_data = dso_local global [10 x i32 ] zeroinitializer , code_model "small" , align 16
45
+ @forced_large_data = dso_local global [10 x i32 ] zeroinitializer , code_model "large" , align 16
45
46
46
47
define dso_local ptr @lea_static_data () #0 {
47
48
; SMALL-STATIC-LABEL: lea_static_data:
@@ -223,6 +224,199 @@ define dso_local ptr @lea_unknown_size_data() #0 {
223
224
ret ptr @unknown_size_data
224
225
}
225
226
227
+ ; TODO: make nopic small and medium instruction sequence the same
228
+ define dso_local ptr @lea_forced_small_data () #0 {
229
+ ; SMALL-STATIC-LABEL: lea_forced_small_data:
230
+ ; SMALL-STATIC: # %bb.0:
231
+ ; SMALL-STATIC-NEXT: movl $forced_small_data, %eax
232
+ ; SMALL-STATIC-NEXT: retq
233
+ ;
234
+ ; MEDIUM-STATIC-LABEL: lea_forced_small_data:
235
+ ; MEDIUM-STATIC: # %bb.0:
236
+ ; MEDIUM-STATIC-NEXT: movabsq $forced_small_data, %rax
237
+ ; MEDIUM-STATIC-NEXT: retq
238
+ ;
239
+ ; LARGE-STATIC-LABEL: lea_forced_small_data:
240
+ ; LARGE-STATIC: # %bb.0:
241
+ ; LARGE-STATIC-NEXT: movabsq $forced_small_data, %rax
242
+ ; LARGE-STATIC-NEXT: retq
243
+ ;
244
+ ; SMALL-PIC-LABEL: lea_forced_small_data:
245
+ ; SMALL-PIC: # %bb.0:
246
+ ; SMALL-PIC-NEXT: leaq forced_small_data(%rip), %rax
247
+ ; SMALL-PIC-NEXT: retq
248
+ ;
249
+ ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_forced_small_data:
250
+ ; MEDIUM-SMALL-DATA-PIC: # %bb.0:
251
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: leaq forced_small_data(%rip), %rax
252
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: retq
253
+ ;
254
+ ; MEDIUM-PIC-LABEL: lea_forced_small_data:
255
+ ; MEDIUM-PIC: # %bb.0:
256
+ ; MEDIUM-PIC-NEXT: leaq forced_small_data(%rip), %rax
257
+ ; MEDIUM-PIC-NEXT: retq
258
+ ;
259
+ ; LARGE-PIC-LABEL: lea_forced_small_data:
260
+ ; LARGE-PIC: # %bb.0:
261
+ ; LARGE-PIC-NEXT: .L4$pb:
262
+ ; LARGE-PIC-NEXT: leaq .L4$pb(%rip), %rax
263
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L4$pb, %rcx
264
+ ; LARGE-PIC-NEXT: addq %rax, %rcx
265
+ ; LARGE-PIC-NEXT: movabsq $forced_small_data@GOTOFF, %rax
266
+ ; LARGE-PIC-NEXT: addq %rcx, %rax
267
+ ; LARGE-PIC-NEXT: retq
268
+ ret ptr @forced_small_data
269
+ }
270
+
271
+ ; TODO: make small and medium instruction sequence the same
272
+ define dso_local i32 @load_forced_small_data () #0 {
273
+ ; SMALL-STATIC-LABEL: load_forced_small_data:
274
+ ; SMALL-STATIC: # %bb.0:
275
+ ; SMALL-STATIC-NEXT: movl forced_small_data+8(%rip), %eax
276
+ ; SMALL-STATIC-NEXT: retq
277
+ ;
278
+ ; MEDIUM-STATIC-LABEL: load_forced_small_data:
279
+ ; MEDIUM-STATIC: # %bb.0:
280
+ ; MEDIUM-STATIC-NEXT: movabsq $forced_small_data, %rax
281
+ ; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
282
+ ; MEDIUM-STATIC-NEXT: retq
283
+ ;
284
+ ; LARGE-STATIC-LABEL: load_forced_small_data:
285
+ ; LARGE-STATIC: # %bb.0:
286
+ ; LARGE-STATIC-NEXT: movabsq $forced_small_data, %rax
287
+ ; LARGE-STATIC-NEXT: movl 8(%rax), %eax
288
+ ; LARGE-STATIC-NEXT: retq
289
+ ;
290
+ ; SMALL-PIC-LABEL: load_forced_small_data:
291
+ ; SMALL-PIC: # %bb.0:
292
+ ; SMALL-PIC-NEXT: movl forced_small_data+8(%rip), %eax
293
+ ; SMALL-PIC-NEXT: retq
294
+ ;
295
+ ; MEDIUM-SMALL-DATA-PIC-LABEL: load_forced_small_data:
296
+ ; MEDIUM-SMALL-DATA-PIC: # %bb.0:
297
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: leaq forced_small_data(%rip), %rax
298
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax), %eax
299
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: retq
300
+ ;
301
+ ; MEDIUM-PIC-LABEL: load_forced_small_data:
302
+ ; MEDIUM-PIC: # %bb.0:
303
+ ; MEDIUM-PIC-NEXT: leaq forced_small_data(%rip), %rax
304
+ ; MEDIUM-PIC-NEXT: movl 8(%rax), %eax
305
+ ; MEDIUM-PIC-NEXT: retq
306
+ ;
307
+ ; LARGE-PIC-LABEL: load_forced_small_data:
308
+ ; LARGE-PIC: # %bb.0:
309
+ ; LARGE-PIC-NEXT: .L5$pb:
310
+ ; LARGE-PIC-NEXT: leaq .L5$pb(%rip), %rax
311
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L5$pb, %rcx
312
+ ; LARGE-PIC-NEXT: addq %rax, %rcx
313
+ ; LARGE-PIC-NEXT: movabsq $forced_small_data@GOTOFF, %rax
314
+ ; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
315
+ ; LARGE-PIC-NEXT: retq
316
+ %rv = load i32 , ptr getelementptr inbounds (i32 , ptr @forced_small_data , i64 2 )
317
+ ret i32 %rv
318
+ }
319
+
320
+ ; TODO: fix small code model instruction sequences to use 64-bit constants
321
+ define dso_local ptr @lea_forced_large_data () #0 {
322
+ ; SMALL-STATIC-LABEL: lea_forced_large_data:
323
+ ; SMALL-STATIC: # %bb.0:
324
+ ; SMALL-STATIC-NEXT: movl $forced_large_data, %eax
325
+ ; SMALL-STATIC-NEXT: retq
326
+ ;
327
+ ; MEDIUM-STATIC-LABEL: lea_forced_large_data:
328
+ ; MEDIUM-STATIC: # %bb.0:
329
+ ; MEDIUM-STATIC-NEXT: movabsq $forced_large_data, %rax
330
+ ; MEDIUM-STATIC-NEXT: retq
331
+ ;
332
+ ; LARGE-STATIC-LABEL: lea_forced_large_data:
333
+ ; LARGE-STATIC: # %bb.0:
334
+ ; LARGE-STATIC-NEXT: movabsq $forced_large_data, %rax
335
+ ; LARGE-STATIC-NEXT: retq
336
+ ;
337
+ ; SMALL-PIC-LABEL: lea_forced_large_data:
338
+ ; SMALL-PIC: # %bb.0:
339
+ ; SMALL-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
340
+ ; SMALL-PIC-NEXT: leaq forced_large_data@GOTOFF(%rax), %rax
341
+ ; SMALL-PIC-NEXT: retq
342
+ ;
343
+ ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_forced_large_data:
344
+ ; MEDIUM-SMALL-DATA-PIC: # %bb.0:
345
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
346
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rax
347
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
348
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: retq
349
+ ;
350
+ ; MEDIUM-PIC-LABEL: lea_forced_large_data:
351
+ ; MEDIUM-PIC: # %bb.0:
352
+ ; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
353
+ ; MEDIUM-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rax
354
+ ; MEDIUM-PIC-NEXT: addq %rcx, %rax
355
+ ; MEDIUM-PIC-NEXT: retq
356
+ ;
357
+ ; LARGE-PIC-LABEL: lea_forced_large_data:
358
+ ; LARGE-PIC: # %bb.0:
359
+ ; LARGE-PIC-NEXT: .L6$pb:
360
+ ; LARGE-PIC-NEXT: leaq .L6$pb(%rip), %rax
361
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L6$pb, %rcx
362
+ ; LARGE-PIC-NEXT: addq %rax, %rcx
363
+ ; LARGE-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rax
364
+ ; LARGE-PIC-NEXT: addq %rcx, %rax
365
+ ; LARGE-PIC-NEXT: retq
366
+ ret ptr @forced_large_data
367
+ }
368
+
369
+ define dso_local i32 @load_forced_large_data () #0 {
370
+ ; SMALL-STATIC-LABEL: load_forced_large_data:
371
+ ; SMALL-STATIC: # %bb.0:
372
+ ; SMALL-STATIC-NEXT: movl forced_large_data+8(%rip), %eax
373
+ ; SMALL-STATIC-NEXT: retq
374
+ ;
375
+ ; MEDIUM-STATIC-LABEL: load_forced_large_data:
376
+ ; MEDIUM-STATIC: # %bb.0:
377
+ ; MEDIUM-STATIC-NEXT: movabsq $forced_large_data, %rax
378
+ ; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
379
+ ; MEDIUM-STATIC-NEXT: retq
380
+ ;
381
+ ; LARGE-STATIC-LABEL: load_forced_large_data:
382
+ ; LARGE-STATIC: # %bb.0:
383
+ ; LARGE-STATIC-NEXT: movabsq $forced_large_data, %rax
384
+ ; LARGE-STATIC-NEXT: movl 8(%rax), %eax
385
+ ; LARGE-STATIC-NEXT: retq
386
+ ;
387
+ ; SMALL-PIC-LABEL: load_forced_large_data:
388
+ ; SMALL-PIC: # %bb.0:
389
+ ; SMALL-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
390
+ ; SMALL-PIC-NEXT: movl forced_large_data@GOTOFF+8(%rax), %eax
391
+ ; SMALL-PIC-NEXT: retq
392
+ ;
393
+ ; MEDIUM-SMALL-DATA-PIC-LABEL: load_forced_large_data:
394
+ ; MEDIUM-SMALL-DATA-PIC: # %bb.0:
395
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
396
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rcx
397
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax,%rcx), %eax
398
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: retq
399
+ ;
400
+ ; MEDIUM-PIC-LABEL: load_forced_large_data:
401
+ ; MEDIUM-PIC: # %bb.0:
402
+ ; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
403
+ ; MEDIUM-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rcx
404
+ ; MEDIUM-PIC-NEXT: movl 8(%rax,%rcx), %eax
405
+ ; MEDIUM-PIC-NEXT: retq
406
+ ;
407
+ ; LARGE-PIC-LABEL: load_forced_large_data:
408
+ ; LARGE-PIC: # %bb.0:
409
+ ; LARGE-PIC-NEXT: .L7$pb:
410
+ ; LARGE-PIC-NEXT: leaq .L7$pb(%rip), %rax
411
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L7$pb, %rcx
412
+ ; LARGE-PIC-NEXT: addq %rax, %rcx
413
+ ; LARGE-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rax
414
+ ; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
415
+ ; LARGE-PIC-NEXT: retq
416
+ %rv = load i32 , ptr getelementptr inbounds (i32 , ptr @forced_large_data , i64 2 )
417
+ ret i32 %rv
418
+ }
419
+
226
420
define dso_local i32 @load_global_data () #0 {
227
421
; SMALL-STATIC-LABEL: load_global_data:
228
422
; SMALL-STATIC: # %bb.0:
@@ -261,9 +455,9 @@ define dso_local i32 @load_global_data() #0 {
261
455
;
262
456
; LARGE-PIC-LABEL: load_global_data:
263
457
; LARGE-PIC: # %bb.0:
264
- ; LARGE-PIC-NEXT: .L4 $pb:
265
- ; LARGE-PIC-NEXT: leaq .L4 $pb(%rip), %rax
266
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L4 $pb, %rcx
458
+ ; LARGE-PIC-NEXT: .L8 $pb:
459
+ ; LARGE-PIC-NEXT: leaq .L8 $pb(%rip), %rax
460
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L8 $pb, %rcx
267
461
; LARGE-PIC-NEXT: addq %rax, %rcx
268
462
; LARGE-PIC-NEXT: movabsq $global_data@GOTOFF, %rax
269
463
; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
@@ -311,9 +505,9 @@ define dso_local i32 @load_extern_data() #0 {
311
505
;
312
506
; LARGE-PIC-LABEL: load_extern_data:
313
507
; LARGE-PIC: # %bb.0:
314
- ; LARGE-PIC-NEXT: .L5 $pb:
315
- ; LARGE-PIC-NEXT: leaq .L5 $pb(%rip), %rax
316
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L5 $pb, %rcx
508
+ ; LARGE-PIC-NEXT: .L9 $pb:
509
+ ; LARGE-PIC-NEXT: leaq .L9 $pb(%rip), %rax
510
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L9 $pb, %rcx
317
511
; LARGE-PIC-NEXT: addq %rax, %rcx
318
512
; LARGE-PIC-NEXT: movabsq $extern_data@GOT, %rax
319
513
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
@@ -362,9 +556,9 @@ define dso_local i32 @load_unknown_size_data() #0 {
362
556
;
363
557
; LARGE-PIC-LABEL: load_unknown_size_data:
364
558
; LARGE-PIC: # %bb.0:
365
- ; LARGE-PIC-NEXT: .L6 $pb:
366
- ; LARGE-PIC-NEXT: leaq .L6 $pb(%rip), %rax
367
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L6 $pb, %rcx
559
+ ; LARGE-PIC-NEXT: .L10 $pb:
560
+ ; LARGE-PIC-NEXT: leaq .L10 $pb(%rip), %rax
561
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L10 $pb, %rcx
368
562
; LARGE-PIC-NEXT: addq %rax, %rcx
369
563
; LARGE-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
370
564
; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
@@ -422,9 +616,9 @@ define dso_local ptr @lea_static_fn() #0 {
422
616
;
423
617
; LARGE-PIC-LABEL: lea_static_fn:
424
618
; LARGE-PIC: # %bb.0:
425
- ; LARGE-PIC-NEXT: .L9 $pb:
426
- ; LARGE-PIC-NEXT: leaq .L9 $pb(%rip), %rax
427
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L9 $pb, %rcx
619
+ ; LARGE-PIC-NEXT: .L13 $pb:
620
+ ; LARGE-PIC-NEXT: leaq .L13 $pb(%rip), %rax
621
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L13 $pb, %rcx
428
622
; LARGE-PIC-NEXT: addq %rax, %rcx
429
623
; LARGE-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
430
624
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -465,9 +659,9 @@ define dso_local ptr @lea_global_fn() #0 {
465
659
;
466
660
; LARGE-PIC-LABEL: lea_global_fn:
467
661
; LARGE-PIC: # %bb.0:
468
- ; LARGE-PIC-NEXT: .L10 $pb:
469
- ; LARGE-PIC-NEXT: leaq .L10 $pb(%rip), %rax
470
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L10 $pb, %rcx
662
+ ; LARGE-PIC-NEXT: .L14 $pb:
663
+ ; LARGE-PIC-NEXT: leaq .L14 $pb(%rip), %rax
664
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L14 $pb, %rcx
471
665
; LARGE-PIC-NEXT: addq %rax, %rcx
472
666
; LARGE-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
473
667
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -508,9 +702,9 @@ define dso_local ptr @lea_extern_fn() #0 {
508
702
;
509
703
; LARGE-PIC-LABEL: lea_extern_fn:
510
704
; LARGE-PIC: # %bb.0:
511
- ; LARGE-PIC-NEXT: .L11 $pb:
512
- ; LARGE-PIC-NEXT: leaq .L11 $pb(%rip), %rax
513
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L11 $pb, %rcx
705
+ ; LARGE-PIC-NEXT: .L15 $pb:
706
+ ; LARGE-PIC-NEXT: leaq .L15 $pb(%rip), %rax
707
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L15 $pb, %rcx
514
708
; LARGE-PIC-NEXT: addq %rax, %rcx
515
709
; LARGE-PIC-NEXT: movabsq $extern_fn@GOT, %rax
516
710
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
@@ -586,9 +780,9 @@ define dso_local float @load_constant_pool(float %x) #0 {
586
780
;
587
781
; LARGE-PIC-LABEL: load_constant_pool:
588
782
; LARGE-PIC: # %bb.0:
589
- ; LARGE-PIC-NEXT: .L13 $pb:
590
- ; LARGE-PIC-NEXT: leaq .L13 $pb(%rip), %rax
591
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L13 $pb, %rcx
783
+ ; LARGE-PIC-NEXT: .L17 $pb:
784
+ ; LARGE-PIC-NEXT: leaq .L17 $pb(%rip), %rax
785
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17 $pb, %rcx
592
786
; LARGE-PIC-NEXT: addq %rax, %rcx
593
787
; LARGE-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
594
788
; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0
0 commit comments