Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; Run with --no_x86_scrub_rip because we care a lot about how globals are
      3 ; accessed in the code model.
      4 
      5 ; RUN: llc < %s -relocation-model=static -code-model=small  | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-STATIC
      6 ; RUN: llc < %s -relocation-model=static -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-STATIC
      7 ; RUN: llc < %s -relocation-model=static -code-model=large  | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-STATIC
      8 ; RUN: llc < %s -relocation-model=pic    -code-model=small  | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-PIC
      9 ; RUN: llc < %s -relocation-model=pic    -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-PIC
     10 ; RUN: llc < %s -relocation-model=pic    -code-model=large  | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-PIC
     11 
     12 ; Generated from this C source:
     13 ;
     14 ; static int static_data[10];
     15 ; int global_data[10] = {1, 2};
     16 ; extern int extern_data[10];
     17 ;
     18 ; int *lea_static_data() { return &static_data[0]; }
     19 ; int *lea_global_data() { return &global_data[0]; }
     20 ; int *lea_extern_data() { return &extern_data[0]; }
     21 ;
     22 ; static void static_fn(void) {}
     23 ; void global_fn(void) {}
     24 ; void extern_fn(void);
     25 ;
     26 ; typedef void (*void_fn)(void);
     27 ; void_fn lea_static_fn() { return &static_fn; }
     28 ; void_fn lea_global_fn() { return &global_fn; }
     29 ; void_fn lea_extern_fn() { return &extern_fn; }
     30 
     31 
     32 ; ModuleID = 'model.c'
     33 source_filename = "model.c"
     34 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
     35 target triple = "x86_64--linux"
     36 
     37 @global_data = dso_local global [10 x i32] [i32 1, i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0], align 16
     38 @static_data = internal global [10 x i32] zeroinitializer, align 16
     39 @extern_data = external global [10 x i32], align 16
     40 
     41 define dso_local i32* @lea_static_data() #0 {
     42 ; SMALL-STATIC-LABEL: lea_static_data:
     43 ; SMALL-STATIC:       # %bb.0:
     44 ; SMALL-STATIC-NEXT:    movl $static_data, %eax
     45 ; SMALL-STATIC-NEXT:    retq
     46 ;
     47 ; MEDIUM-STATIC-LABEL: lea_static_data:
     48 ; MEDIUM-STATIC:       # %bb.0:
     49 ; MEDIUM-STATIC-NEXT:    movabsq $static_data, %rax
     50 ; MEDIUM-STATIC-NEXT:    retq
     51 ;
     52 ; LARGE-STATIC-LABEL: lea_static_data:
     53 ; LARGE-STATIC:       # %bb.0:
     54 ; LARGE-STATIC-NEXT:    movabsq $static_data, %rax
     55 ; LARGE-STATIC-NEXT:    retq
     56 ;
     57 ; SMALL-PIC-LABEL: lea_static_data:
     58 ; SMALL-PIC:       # %bb.0:
     59 ; SMALL-PIC-NEXT:    leaq static_data(%rip), %rax
     60 ; SMALL-PIC-NEXT:    retq
     61 ;
     62 ; MEDIUM-PIC-LABEL: lea_static_data:
     63 ; MEDIUM-PIC:       # %bb.0:
     64 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
     65 ; MEDIUM-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
     66 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
     67 ; MEDIUM-PIC-NEXT:    retq
     68 ;
     69 ; LARGE-PIC-LABEL: lea_static_data:
     70 ; LARGE-PIC:       # %bb.0:
     71 ; LARGE-PIC-NEXT:  .Ltmp0:
     72 ; LARGE-PIC-NEXT:    leaq .Ltmp0(%rip), %rcx
     73 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp0, %rax
     74 ; LARGE-PIC-NEXT:    addq %rax, %rcx
     75 ; LARGE-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
     76 ; LARGE-PIC-NEXT:    addq %rcx, %rax
     77 ; LARGE-PIC-NEXT:    retq
     78   ret i32* getelementptr inbounds ([10 x i32], [10 x i32]* @static_data, i64 0, i64 0)
     79 }
     80 
     81 define dso_local i32* @lea_global_data() #0 {
     82 ; SMALL-STATIC-LABEL: lea_global_data:
     83 ; SMALL-STATIC:       # %bb.0:
     84 ; SMALL-STATIC-NEXT:    movl $global_data, %eax
     85 ; SMALL-STATIC-NEXT:    retq
     86 ;
     87 ; MEDIUM-STATIC-LABEL: lea_global_data:
     88 ; MEDIUM-STATIC:       # %bb.0:
     89 ; MEDIUM-STATIC-NEXT:    movabsq $global_data, %rax
     90 ; MEDIUM-STATIC-NEXT:    retq
     91 ;
     92 ; LARGE-STATIC-LABEL: lea_global_data:
     93 ; LARGE-STATIC:       # %bb.0:
     94 ; LARGE-STATIC-NEXT:    movabsq $global_data, %rax
     95 ; LARGE-STATIC-NEXT:    retq
     96 ;
     97 ; SMALL-PIC-LABEL: lea_global_data:
     98 ; SMALL-PIC:       # %bb.0:
     99 ; SMALL-PIC-NEXT:    leaq global_data(%rip), %rax
    100 ; SMALL-PIC-NEXT:    retq
    101 ;
    102 ; MEDIUM-PIC-LABEL: lea_global_data:
    103 ; MEDIUM-PIC:       # %bb.0:
    104 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
    105 ; MEDIUM-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
    106 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
    107 ; MEDIUM-PIC-NEXT:    retq
    108 ;
    109 ; LARGE-PIC-LABEL: lea_global_data:
    110 ; LARGE-PIC:       # %bb.0:
    111 ; LARGE-PIC-NEXT:  .Ltmp1:
    112 ; LARGE-PIC-NEXT:    leaq .Ltmp1(%rip), %rcx
    113 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp1, %rax
    114 ; LARGE-PIC-NEXT:    addq %rax, %rcx
    115 ; LARGE-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
    116 ; LARGE-PIC-NEXT:    addq %rcx, %rax
    117 ; LARGE-PIC-NEXT:    retq
    118   ret i32* getelementptr inbounds ([10 x i32], [10 x i32]* @global_data, i64 0, i64 0)
    119 }
    120 
    121 define dso_local i32* @lea_extern_data() #0 {
    122 ; SMALL-STATIC-LABEL: lea_extern_data:
    123 ; SMALL-STATIC:       # %bb.0:
    124 ; SMALL-STATIC-NEXT:    movl $extern_data, %eax
    125 ; SMALL-STATIC-NEXT:    retq
    126 ;
    127 ; MEDIUM-STATIC-LABEL: lea_extern_data:
    128 ; MEDIUM-STATIC:       # %bb.0:
    129 ; MEDIUM-STATIC-NEXT:    movabsq $extern_data, %rax
    130 ; MEDIUM-STATIC-NEXT:    retq
    131 ;
    132 ; LARGE-STATIC-LABEL: lea_extern_data:
    133 ; LARGE-STATIC:       # %bb.0:
    134 ; LARGE-STATIC-NEXT:    movabsq $extern_data, %rax
    135 ; LARGE-STATIC-NEXT:    retq
    136 ;
    137 ; SMALL-PIC-LABEL: lea_extern_data:
    138 ; SMALL-PIC:       # %bb.0:
    139 ; SMALL-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
    140 ; SMALL-PIC-NEXT:    retq
    141 ;
    142 ; MEDIUM-PIC-LABEL: lea_extern_data:
    143 ; MEDIUM-PIC:       # %bb.0:
    144 ; MEDIUM-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
    145 ; MEDIUM-PIC-NEXT:    retq
    146 ;
    147 ; LARGE-PIC-LABEL: lea_extern_data:
    148 ; LARGE-PIC:       # %bb.0:
    149 ; LARGE-PIC-NEXT:  .Ltmp2:
    150 ; LARGE-PIC-NEXT:    leaq .Ltmp2(%rip), %rax
    151 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp2, %rcx
    152 ; LARGE-PIC-NEXT:    addq %rcx, %rax
    153 ; LARGE-PIC-NEXT:    movabsq $extern_data@GOT, %rcx
    154 ; LARGE-PIC-NEXT:    movq (%rax,%rcx), %rax
    155 ; LARGE-PIC-NEXT:    retq
    156   ret i32* getelementptr inbounds ([10 x i32], [10 x i32]* @extern_data, i64 0, i64 0)
    157 }
    158 
    159 define dso_local i32 @load_global_data() #0 {
    160 ; SMALL-STATIC-LABEL: load_global_data:
    161 ; SMALL-STATIC:       # %bb.0:
    162 ; SMALL-STATIC-NEXT:    movl global_data+8(%rip), %eax
    163 ; SMALL-STATIC-NEXT:    retq
    164 ;
    165 ; MEDIUM-STATIC-LABEL: load_global_data:
    166 ; MEDIUM-STATIC:       # %bb.0:
    167 ; MEDIUM-STATIC-NEXT:    movabsq $global_data, %rax
    168 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
    169 ; MEDIUM-STATIC-NEXT:    retq
    170 ;
    171 ; LARGE-STATIC-LABEL: load_global_data:
    172 ; LARGE-STATIC:       # %bb.0:
    173 ; LARGE-STATIC-NEXT:    movabsq $global_data, %rax
    174 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
    175 ; LARGE-STATIC-NEXT:    retq
    176 ;
    177 ; SMALL-PIC-LABEL: load_global_data:
    178 ; SMALL-PIC:       # %bb.0:
    179 ; SMALL-PIC-NEXT:    movl global_data+8(%rip), %eax
    180 ; SMALL-PIC-NEXT:    retq
    181 ;
    182 ; MEDIUM-PIC-LABEL: load_global_data:
    183 ; MEDIUM-PIC:       # %bb.0:
    184 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
    185 ; MEDIUM-PIC-NEXT:    movabsq $global_data@GOTOFF, %rcx
    186 ; MEDIUM-PIC-NEXT:    movl 8(%rax,%rcx), %eax
    187 ; MEDIUM-PIC-NEXT:    retq
    188 ;
    189 ; LARGE-PIC-LABEL: load_global_data:
    190 ; LARGE-PIC:       # %bb.0:
    191 ; LARGE-PIC-NEXT:  .Ltmp3:
    192 ; LARGE-PIC-NEXT:    leaq .Ltmp3(%rip), %rax
    193 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp3, %rcx
    194 ; LARGE-PIC-NEXT:    addq %rcx, %rax
    195 ; LARGE-PIC-NEXT:    movabsq $global_data@GOTOFF, %rcx
    196 ; LARGE-PIC-NEXT:    movl 8(%rax,%rcx), %eax
    197 ; LARGE-PIC-NEXT:    retq
    198   %rv = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @global_data, i64 0, i64 2)
    199   ret i32 %rv
    200 }
    201 
    202 define dso_local i32 @load_extern_data() #0 {
    203 ; SMALL-STATIC-LABEL: load_extern_data:
    204 ; SMALL-STATIC:       # %bb.0:
    205 ; SMALL-STATIC-NEXT:    movl extern_data+8(%rip), %eax
    206 ; SMALL-STATIC-NEXT:    retq
    207 ;
    208 ; MEDIUM-STATIC-LABEL: load_extern_data:
    209 ; MEDIUM-STATIC:       # %bb.0:
    210 ; MEDIUM-STATIC-NEXT:    movabsq $extern_data, %rax
    211 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
    212 ; MEDIUM-STATIC-NEXT:    retq
    213 ;
    214 ; LARGE-STATIC-LABEL: load_extern_data:
    215 ; LARGE-STATIC:       # %bb.0:
    216 ; LARGE-STATIC-NEXT:    movabsq $extern_data, %rax
    217 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
    218 ; LARGE-STATIC-NEXT:    retq
    219 ;
    220 ; SMALL-PIC-LABEL: load_extern_data:
    221 ; SMALL-PIC:       # %bb.0:
    222 ; SMALL-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
    223 ; SMALL-PIC-NEXT:    movl 8(%rax), %eax
    224 ; SMALL-PIC-NEXT:    retq
    225 ;
    226 ; MEDIUM-PIC-LABEL: load_extern_data:
    227 ; MEDIUM-PIC:       # %bb.0:
    228 ; MEDIUM-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
    229 ; MEDIUM-PIC-NEXT:    movl 8(%rax), %eax
    230 ; MEDIUM-PIC-NEXT:    retq
    231 ;
    232 ; LARGE-PIC-LABEL: load_extern_data:
    233 ; LARGE-PIC:       # %bb.0:
    234 ; LARGE-PIC-NEXT:  .Ltmp4:
    235 ; LARGE-PIC-NEXT:    leaq .Ltmp4(%rip), %rax
    236 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp4, %rcx
    237 ; LARGE-PIC-NEXT:    addq %rcx, %rax
    238 ; LARGE-PIC-NEXT:    movabsq $extern_data@GOT, %rcx
    239 ; LARGE-PIC-NEXT:    movq (%rax,%rcx), %rax
    240 ; LARGE-PIC-NEXT:    movl 8(%rax), %eax
    241 ; LARGE-PIC-NEXT:    retq
    242   %rv = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @extern_data, i64 0, i64 2)
    243   ret i32 %rv
    244 }
    245 
    246 define dso_local void @global_fn() #0 {
    247 ; CHECK-LABEL: global_fn:
    248 ; CHECK:       # %bb.0:
    249 ; CHECK-NEXT:    retq
    250   ret void
    251 }
    252 
    253 define internal void @static_fn() #0 {
    254 ; CHECK-LABEL: static_fn:
    255 ; CHECK:       # %bb.0:
    256 ; CHECK-NEXT:    retq
    257   ret void
    258 }
    259 
    260 declare void @extern_fn()
    261 
    262 define dso_local void ()* @lea_static_fn() #0 {
    263 ; SMALL-STATIC-LABEL: lea_static_fn:
    264 ; SMALL-STATIC:       # %bb.0:
    265 ; SMALL-STATIC-NEXT:    movl $static_fn, %eax
    266 ; SMALL-STATIC-NEXT:    retq
    267 ;
    268 ; MEDIUM-STATIC-LABEL: lea_static_fn:
    269 ; MEDIUM-STATIC:       # %bb.0:
    270 ; MEDIUM-STATIC-NEXT:    movabsq $static_fn, %rax
    271 ; MEDIUM-STATIC-NEXT:    retq
    272 ;
    273 ; LARGE-STATIC-LABEL: lea_static_fn:
    274 ; LARGE-STATIC:       # %bb.0:
    275 ; LARGE-STATIC-NEXT:    movabsq $static_fn, %rax
    276 ; LARGE-STATIC-NEXT:    retq
    277 ;
    278 ; SMALL-PIC-LABEL: lea_static_fn:
    279 ; SMALL-PIC:       # %bb.0:
    280 ; SMALL-PIC-NEXT:    leaq static_fn(%rip), %rax
    281 ; SMALL-PIC-NEXT:    retq
    282 ;
    283 ; MEDIUM-PIC-LABEL: lea_static_fn:
    284 ; MEDIUM-PIC:       # %bb.0:
    285 ; MEDIUM-PIC-NEXT:    movabsq $static_fn, %rax
    286 ; MEDIUM-PIC-NEXT:    retq
    287 ;
    288 ; LARGE-PIC-LABEL: lea_static_fn:
    289 ; LARGE-PIC:       # %bb.0:
    290 ; LARGE-PIC-NEXT:  .Ltmp5:
    291 ; LARGE-PIC-NEXT:    leaq .Ltmp5(%rip), %rcx
    292 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp5, %rax
    293 ; LARGE-PIC-NEXT:    addq %rax, %rcx
    294 ; LARGE-PIC-NEXT:    movabsq $static_fn@GOTOFF, %rax
    295 ; LARGE-PIC-NEXT:    addq %rcx, %rax
    296 ; LARGE-PIC-NEXT:    retq
    297   ret void ()* @static_fn
    298 }
    299 
    300 define dso_local void ()* @lea_global_fn() #0 {
    301 ; SMALL-STATIC-LABEL: lea_global_fn:
    302 ; SMALL-STATIC:       # %bb.0:
    303 ; SMALL-STATIC-NEXT:    movl $global_fn, %eax
    304 ; SMALL-STATIC-NEXT:    retq
    305 ;
    306 ; MEDIUM-STATIC-LABEL: lea_global_fn:
    307 ; MEDIUM-STATIC:       # %bb.0:
    308 ; MEDIUM-STATIC-NEXT:    movabsq $global_fn, %rax
    309 ; MEDIUM-STATIC-NEXT:    retq
    310 ;
    311 ; LARGE-STATIC-LABEL: lea_global_fn:
    312 ; LARGE-STATIC:       # %bb.0:
    313 ; LARGE-STATIC-NEXT:    movabsq $global_fn, %rax
    314 ; LARGE-STATIC-NEXT:    retq
    315 ;
    316 ; SMALL-PIC-LABEL: lea_global_fn:
    317 ; SMALL-PIC:       # %bb.0:
    318 ; SMALL-PIC-NEXT:    leaq global_fn(%rip), %rax
    319 ; SMALL-PIC-NEXT:    retq
    320 ;
    321 ; MEDIUM-PIC-LABEL: lea_global_fn:
    322 ; MEDIUM-PIC:       # %bb.0:
    323 ; MEDIUM-PIC-NEXT:    movabsq $global_fn, %rax
    324 ; MEDIUM-PIC-NEXT:    retq
    325 ;
    326 ; LARGE-PIC-LABEL: lea_global_fn:
    327 ; LARGE-PIC:       # %bb.0:
    328 ; LARGE-PIC-NEXT:  .Ltmp6:
    329 ; LARGE-PIC-NEXT:    leaq .Ltmp6(%rip), %rcx
    330 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp6, %rax
    331 ; LARGE-PIC-NEXT:    addq %rax, %rcx
    332 ; LARGE-PIC-NEXT:    movabsq $global_fn@GOTOFF, %rax
    333 ; LARGE-PIC-NEXT:    addq %rcx, %rax
    334 ; LARGE-PIC-NEXT:    retq
    335   ret void ()* @global_fn
    336 }
    337 
    338 define dso_local void ()* @lea_extern_fn() #0 {
    339 ; SMALL-STATIC-LABEL: lea_extern_fn:
    340 ; SMALL-STATIC:       # %bb.0:
    341 ; SMALL-STATIC-NEXT:    movl $extern_fn, %eax
    342 ; SMALL-STATIC-NEXT:    retq
    343 ;
    344 ; MEDIUM-STATIC-LABEL: lea_extern_fn:
    345 ; MEDIUM-STATIC:       # %bb.0:
    346 ; MEDIUM-STATIC-NEXT:    movabsq $extern_fn, %rax
    347 ; MEDIUM-STATIC-NEXT:    retq
    348 ;
    349 ; LARGE-STATIC-LABEL: lea_extern_fn:
    350 ; LARGE-STATIC:       # %bb.0:
    351 ; LARGE-STATIC-NEXT:    movabsq $extern_fn, %rax
    352 ; LARGE-STATIC-NEXT:    retq
    353 ;
    354 ; SMALL-PIC-LABEL: lea_extern_fn:
    355 ; SMALL-PIC:       # %bb.0:
    356 ; SMALL-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
    357 ; SMALL-PIC-NEXT:    retq
    358 ;
    359 ; MEDIUM-PIC-LABEL: lea_extern_fn:
    360 ; MEDIUM-PIC:       # %bb.0:
    361 ; MEDIUM-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
    362 ; MEDIUM-PIC-NEXT:    retq
    363 ;
    364 ; LARGE-PIC-LABEL: lea_extern_fn:
    365 ; LARGE-PIC:       # %bb.0:
    366 ; LARGE-PIC-NEXT:  .Ltmp7:
    367 ; LARGE-PIC-NEXT:    leaq .Ltmp7(%rip), %rax
    368 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp7, %rcx
    369 ; LARGE-PIC-NEXT:    addq %rcx, %rax
    370 ; LARGE-PIC-NEXT:    movabsq $extern_fn@GOT, %rcx
    371 ; LARGE-PIC-NEXT:    movq (%rax,%rcx), %rax
    372 ; LARGE-PIC-NEXT:    retq
    373   ret void ()* @extern_fn
    374 }
    375 
    376 attributes #0 = { noinline nounwind uwtable }
    377 
    378 !llvm.module.flags = !{!0, !1, !2}
    379 !llvm.ident = !{!3}
    380 
    381 !0 = !{i32 1, !"wchar_size", i32 4}
    382 !1 = !{i32 7, !"PIC Level", i32 2}
    383 !2 = !{i32 7, !"PIE Level", i32 2}
    384 !3 = !{!"clang version 7.0.0 "}
    385