Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=x86-64      | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=atom        | FileCheck %s --check-prefix=CHECK --check-prefix=ATOM
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=slm         | FileCheck %s --check-prefix=CHECK --check-prefix=SLM
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge   | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell     | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
      8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=broadwell   | FileCheck %s --check-prefix=CHECK --check-prefix=BROADWELL
      9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake     | FileCheck %s --check-prefix=CHECK --check-prefix=SKYLAKE
     10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=knl         | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
     11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2      | FileCheck %s --check-prefix=CHECK --check-prefix=BTVER2
     12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1      | FileCheck %s --check-prefix=CHECK --check-prefix=ZNVER1
     13 
     14 define i32 @test_lea_offset(i32) {
     15 ; GENERIC-LABEL: test_lea_offset:
     16 ; GENERIC:       # %bb.0:
     17 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
     18 ; GENERIC-NEXT:    leal -24(%rdi), %eax # sched: [1:0.50]
     19 ; GENERIC-NEXT:    retq # sched: [1:1.00]
     20 ;
     21 ; ATOM-LABEL: test_lea_offset:
     22 ; ATOM:       # %bb.0:
     23 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
     24 ; ATOM-NEXT:    leal -24(%rdi), %eax # sched: [1:1.00]
     25 ; ATOM-NEXT:    nop # sched: [1:0.50]
     26 ; ATOM-NEXT:    nop # sched: [1:0.50]
     27 ; ATOM-NEXT:    nop # sched: [1:0.50]
     28 ; ATOM-NEXT:    nop # sched: [1:0.50]
     29 ; ATOM-NEXT:    nop # sched: [1:0.50]
     30 ; ATOM-NEXT:    nop # sched: [1:0.50]
     31 ; ATOM-NEXT:    retq # sched: [79:39.50]
     32 ;
     33 ; SLM-LABEL: test_lea_offset:
     34 ; SLM:       # %bb.0:
     35 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
     36 ; SLM-NEXT:    leal -24(%rdi), %eax # sched: [1:1.00]
     37 ; SLM-NEXT:    retq # sched: [4:1.00]
     38 ;
     39 ; SANDY-LABEL: test_lea_offset:
     40 ; SANDY:       # %bb.0:
     41 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
     42 ; SANDY-NEXT:    leal -24(%rdi), %eax # sched: [1:0.50]
     43 ; SANDY-NEXT:    retq # sched: [1:1.00]
     44 ;
     45 ; HASWELL-LABEL: test_lea_offset:
     46 ; HASWELL:       # %bb.0:
     47 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
     48 ; HASWELL-NEXT:    leal -24(%rdi), %eax # sched: [1:0.50]
     49 ; HASWELL-NEXT:    retq # sched: [7:1.00]
     50 ;
     51 ; BROADWELL-LABEL: test_lea_offset:
     52 ; BROADWELL:       # %bb.0:
     53 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
     54 ; BROADWELL-NEXT:    leal -24(%rdi), %eax # sched: [1:0.50]
     55 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
     56 ;
     57 ; SKYLAKE-LABEL: test_lea_offset:
     58 ; SKYLAKE:       # %bb.0:
     59 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
     60 ; SKYLAKE-NEXT:    leal -24(%rdi), %eax # sched: [1:0.50]
     61 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
     62 ;
     63 ; BTVER2-LABEL: test_lea_offset:
     64 ; BTVER2:       # %bb.0:
     65 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
     66 ; BTVER2-NEXT:    leal -24(%rdi), %eax # sched: [1:0.50]
     67 ; BTVER2-NEXT:    retq # sched: [4:1.00]
     68 ;
     69 ; ZNVER1-LABEL: test_lea_offset:
     70 ; ZNVER1:       # %bb.0:
     71 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
     72 ; ZNVER1-NEXT:    leal -24(%rdi), %eax # sched: [1:0.25]
     73 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
     74   %2 = add nsw i32 %0, -24
     75   ret i32 %2
     76 }
     77 
     78 define i32 @test_lea_offset_big(i32) {
     79 ; GENERIC-LABEL: test_lea_offset_big:
     80 ; GENERIC:       # %bb.0:
     81 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
     82 ; GENERIC-NEXT:    leal 1024(%rdi), %eax # sched: [1:0.50]
     83 ; GENERIC-NEXT:    retq # sched: [1:1.00]
     84 ;
     85 ; ATOM-LABEL: test_lea_offset_big:
     86 ; ATOM:       # %bb.0:
     87 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
     88 ; ATOM-NEXT:    leal 1024(%rdi), %eax # sched: [1:1.00]
     89 ; ATOM-NEXT:    nop # sched: [1:0.50]
     90 ; ATOM-NEXT:    nop # sched: [1:0.50]
     91 ; ATOM-NEXT:    nop # sched: [1:0.50]
     92 ; ATOM-NEXT:    nop # sched: [1:0.50]
     93 ; ATOM-NEXT:    nop # sched: [1:0.50]
     94 ; ATOM-NEXT:    nop # sched: [1:0.50]
     95 ; ATOM-NEXT:    retq # sched: [79:39.50]
     96 ;
     97 ; SLM-LABEL: test_lea_offset_big:
     98 ; SLM:       # %bb.0:
     99 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    100 ; SLM-NEXT:    leal 1024(%rdi), %eax # sched: [1:1.00]
    101 ; SLM-NEXT:    retq # sched: [4:1.00]
    102 ;
    103 ; SANDY-LABEL: test_lea_offset_big:
    104 ; SANDY:       # %bb.0:
    105 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    106 ; SANDY-NEXT:    leal 1024(%rdi), %eax # sched: [1:0.50]
    107 ; SANDY-NEXT:    retq # sched: [1:1.00]
    108 ;
    109 ; HASWELL-LABEL: test_lea_offset_big:
    110 ; HASWELL:       # %bb.0:
    111 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    112 ; HASWELL-NEXT:    leal 1024(%rdi), %eax # sched: [1:0.50]
    113 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    114 ;
    115 ; BROADWELL-LABEL: test_lea_offset_big:
    116 ; BROADWELL:       # %bb.0:
    117 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    118 ; BROADWELL-NEXT:    leal 1024(%rdi), %eax # sched: [1:0.50]
    119 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    120 ;
    121 ; SKYLAKE-LABEL: test_lea_offset_big:
    122 ; SKYLAKE:       # %bb.0:
    123 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    124 ; SKYLAKE-NEXT:    leal 1024(%rdi), %eax # sched: [1:0.50]
    125 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    126 ;
    127 ; BTVER2-LABEL: test_lea_offset_big:
    128 ; BTVER2:       # %bb.0:
    129 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    130 ; BTVER2-NEXT:    leal 1024(%rdi), %eax # sched: [1:0.50]
    131 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    132 ;
    133 ; ZNVER1-LABEL: test_lea_offset_big:
    134 ; ZNVER1:       # %bb.0:
    135 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    136 ; ZNVER1-NEXT:    leal 1024(%rdi), %eax # sched: [1:0.25]
    137 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    138   %2 = add nsw i32 %0, 1024
    139   ret i32 %2
    140 }
    141 
    142 ; Function Attrs: norecurse nounwind readnone uwtable
    143 define i32 @test_lea_add(i32, i32) {
    144 ; GENERIC-LABEL: test_lea_add:
    145 ; GENERIC:       # %bb.0:
    146 ; GENERIC-NEXT:    # kill: def $esi killed $esi def $rsi
    147 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    148 ; GENERIC-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    149 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    150 ;
    151 ; ATOM-LABEL: test_lea_add:
    152 ; ATOM:       # %bb.0:
    153 ; ATOM-NEXT:    # kill: def $esi killed $esi def $rsi
    154 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    155 ; ATOM-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:1.00]
    156 ; ATOM-NEXT:    nop # sched: [1:0.50]
    157 ; ATOM-NEXT:    nop # sched: [1:0.50]
    158 ; ATOM-NEXT:    nop # sched: [1:0.50]
    159 ; ATOM-NEXT:    nop # sched: [1:0.50]
    160 ; ATOM-NEXT:    nop # sched: [1:0.50]
    161 ; ATOM-NEXT:    nop # sched: [1:0.50]
    162 ; ATOM-NEXT:    retq # sched: [79:39.50]
    163 ;
    164 ; SLM-LABEL: test_lea_add:
    165 ; SLM:       # %bb.0:
    166 ; SLM-NEXT:    # kill: def $esi killed $esi def $rsi
    167 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    168 ; SLM-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:1.00]
    169 ; SLM-NEXT:    retq # sched: [4:1.00]
    170 ;
    171 ; SANDY-LABEL: test_lea_add:
    172 ; SANDY:       # %bb.0:
    173 ; SANDY-NEXT:    # kill: def $esi killed $esi def $rsi
    174 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    175 ; SANDY-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    176 ; SANDY-NEXT:    retq # sched: [1:1.00]
    177 ;
    178 ; HASWELL-LABEL: test_lea_add:
    179 ; HASWELL:       # %bb.0:
    180 ; HASWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    181 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    182 ; HASWELL-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    183 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    184 ;
    185 ; BROADWELL-LABEL: test_lea_add:
    186 ; BROADWELL:       # %bb.0:
    187 ; BROADWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    188 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    189 ; BROADWELL-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    190 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    191 ;
    192 ; SKYLAKE-LABEL: test_lea_add:
    193 ; SKYLAKE:       # %bb.0:
    194 ; SKYLAKE-NEXT:    # kill: def $esi killed $esi def $rsi
    195 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    196 ; SKYLAKE-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    197 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    198 ;
    199 ; BTVER2-LABEL: test_lea_add:
    200 ; BTVER2:       # %bb.0:
    201 ; BTVER2-NEXT:    # kill: def $esi killed $esi def $rsi
    202 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    203 ; BTVER2-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    204 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    205 ;
    206 ; ZNVER1-LABEL: test_lea_add:
    207 ; ZNVER1:       # %bb.0:
    208 ; ZNVER1-NEXT:    # kill: def $esi killed $esi def $rsi
    209 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    210 ; ZNVER1-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.25]
    211 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    212   %3 = add nsw i32 %1, %0
    213   ret i32 %3
    214 }
    215 
    216 define i32 @test_lea_add_offset(i32, i32) {
    217 ; GENERIC-LABEL: test_lea_add_offset:
    218 ; GENERIC:       # %bb.0:
    219 ; GENERIC-NEXT:    # kill: def $esi killed $esi def $rsi
    220 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    221 ; GENERIC-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    222 ; GENERIC-NEXT:    addl $16, %eax # sched: [1:0.33]
    223 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    224 ;
    225 ; ATOM-LABEL: test_lea_add_offset:
    226 ; ATOM:       # %bb.0:
    227 ; ATOM-NEXT:    # kill: def $esi killed $esi def $rsi
    228 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    229 ; ATOM-NEXT:    leal 16(%rdi,%rsi), %eax # sched: [1:1.00]
    230 ; ATOM-NEXT:    nop # sched: [1:0.50]
    231 ; ATOM-NEXT:    nop # sched: [1:0.50]
    232 ; ATOM-NEXT:    nop # sched: [1:0.50]
    233 ; ATOM-NEXT:    nop # sched: [1:0.50]
    234 ; ATOM-NEXT:    nop # sched: [1:0.50]
    235 ; ATOM-NEXT:    nop # sched: [1:0.50]
    236 ; ATOM-NEXT:    retq # sched: [79:39.50]
    237 ;
    238 ; SLM-LABEL: test_lea_add_offset:
    239 ; SLM:       # %bb.0:
    240 ; SLM-NEXT:    # kill: def $esi killed $esi def $rsi
    241 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    242 ; SLM-NEXT:    leal 16(%rdi,%rsi), %eax # sched: [1:1.00]
    243 ; SLM-NEXT:    retq # sched: [4:1.00]
    244 ;
    245 ; SANDY-LABEL: test_lea_add_offset:
    246 ; SANDY:       # %bb.0:
    247 ; SANDY-NEXT:    # kill: def $esi killed $esi def $rsi
    248 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    249 ; SANDY-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    250 ; SANDY-NEXT:    addl $16, %eax # sched: [1:0.33]
    251 ; SANDY-NEXT:    retq # sched: [1:1.00]
    252 ;
    253 ; HASWELL-LABEL: test_lea_add_offset:
    254 ; HASWELL:       # %bb.0:
    255 ; HASWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    256 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    257 ; HASWELL-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    258 ; HASWELL-NEXT:    addl $16, %eax # sched: [1:0.25]
    259 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    260 ;
    261 ; BROADWELL-LABEL: test_lea_add_offset:
    262 ; BROADWELL:       # %bb.0:
    263 ; BROADWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    264 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    265 ; BROADWELL-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    266 ; BROADWELL-NEXT:    addl $16, %eax # sched: [1:0.25]
    267 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    268 ;
    269 ; SKYLAKE-LABEL: test_lea_add_offset:
    270 ; SKYLAKE:       # %bb.0:
    271 ; SKYLAKE-NEXT:    # kill: def $esi killed $esi def $rsi
    272 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    273 ; SKYLAKE-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    274 ; SKYLAKE-NEXT:    addl $16, %eax # sched: [1:0.25]
    275 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    276 ;
    277 ; BTVER2-LABEL: test_lea_add_offset:
    278 ; BTVER2:       # %bb.0:
    279 ; BTVER2-NEXT:    # kill: def $esi killed $esi def $rsi
    280 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    281 ; BTVER2-NEXT:    leal 16(%rdi,%rsi), %eax # sched: [2:1.00]
    282 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    283 ;
    284 ; ZNVER1-LABEL: test_lea_add_offset:
    285 ; ZNVER1:       # %bb.0:
    286 ; ZNVER1-NEXT:    # kill: def $esi killed $esi def $rsi
    287 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    288 ; ZNVER1-NEXT:    leal 16(%rdi,%rsi), %eax # sched: [1:0.25]
    289 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    290   %3 = add i32 %0, 16
    291   %4 = add i32 %3, %1
    292   ret i32 %4
    293 }
    294 
    295 define i32 @test_lea_add_offset_big(i32, i32) {
    296 ; GENERIC-LABEL: test_lea_add_offset_big:
    297 ; GENERIC:       # %bb.0:
    298 ; GENERIC-NEXT:    # kill: def $esi killed $esi def $rsi
    299 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    300 ; GENERIC-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    301 ; GENERIC-NEXT:    addl $-4096, %eax # imm = 0xF000
    302 ; GENERIC-NEXT:    # sched: [1:0.33]
    303 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    304 ;
    305 ; ATOM-LABEL: test_lea_add_offset_big:
    306 ; ATOM:       # %bb.0:
    307 ; ATOM-NEXT:    # kill: def $esi killed $esi def $rsi
    308 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    309 ; ATOM-NEXT:    leal -4096(%rdi,%rsi), %eax # sched: [1:1.00]
    310 ; ATOM-NEXT:    nop # sched: [1:0.50]
    311 ; ATOM-NEXT:    nop # sched: [1:0.50]
    312 ; ATOM-NEXT:    nop # sched: [1:0.50]
    313 ; ATOM-NEXT:    nop # sched: [1:0.50]
    314 ; ATOM-NEXT:    nop # sched: [1:0.50]
    315 ; ATOM-NEXT:    nop # sched: [1:0.50]
    316 ; ATOM-NEXT:    retq # sched: [79:39.50]
    317 ;
    318 ; SLM-LABEL: test_lea_add_offset_big:
    319 ; SLM:       # %bb.0:
    320 ; SLM-NEXT:    # kill: def $esi killed $esi def $rsi
    321 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    322 ; SLM-NEXT:    leal -4096(%rdi,%rsi), %eax # sched: [1:1.00]
    323 ; SLM-NEXT:    retq # sched: [4:1.00]
    324 ;
    325 ; SANDY-LABEL: test_lea_add_offset_big:
    326 ; SANDY:       # %bb.0:
    327 ; SANDY-NEXT:    # kill: def $esi killed $esi def $rsi
    328 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    329 ; SANDY-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    330 ; SANDY-NEXT:    addl $-4096, %eax # imm = 0xF000
    331 ; SANDY-NEXT:    # sched: [1:0.33]
    332 ; SANDY-NEXT:    retq # sched: [1:1.00]
    333 ;
    334 ; HASWELL-LABEL: test_lea_add_offset_big:
    335 ; HASWELL:       # %bb.0:
    336 ; HASWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    337 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    338 ; HASWELL-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    339 ; HASWELL-NEXT:    addl $-4096, %eax # imm = 0xF000
    340 ; HASWELL-NEXT:    # sched: [1:0.25]
    341 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    342 ;
    343 ; BROADWELL-LABEL: test_lea_add_offset_big:
    344 ; BROADWELL:       # %bb.0:
    345 ; BROADWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    346 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    347 ; BROADWELL-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    348 ; BROADWELL-NEXT:    addl $-4096, %eax # imm = 0xF000
    349 ; BROADWELL-NEXT:    # sched: [1:0.25]
    350 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    351 ;
    352 ; SKYLAKE-LABEL: test_lea_add_offset_big:
    353 ; SKYLAKE:       # %bb.0:
    354 ; SKYLAKE-NEXT:    # kill: def $esi killed $esi def $rsi
    355 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    356 ; SKYLAKE-NEXT:    leal (%rdi,%rsi), %eax # sched: [1:0.50]
    357 ; SKYLAKE-NEXT:    addl $-4096, %eax # imm = 0xF000
    358 ; SKYLAKE-NEXT:    # sched: [1:0.25]
    359 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    360 ;
    361 ; BTVER2-LABEL: test_lea_add_offset_big:
    362 ; BTVER2:       # %bb.0:
    363 ; BTVER2-NEXT:    # kill: def $esi killed $esi def $rsi
    364 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    365 ; BTVER2-NEXT:    leal -4096(%rdi,%rsi), %eax # sched: [2:1.00]
    366 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    367 ;
    368 ; ZNVER1-LABEL: test_lea_add_offset_big:
    369 ; ZNVER1:       # %bb.0:
    370 ; ZNVER1-NEXT:    # kill: def $esi killed $esi def $rsi
    371 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    372 ; ZNVER1-NEXT:    leal -4096(%rdi,%rsi), %eax # sched: [1:0.25]
    373 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    374   %3 = add i32 %0, -4096
    375   %4 = add i32 %3, %1
    376   ret i32 %4
    377 }
    378 
    379 define i32 @test_lea_mul(i32) {
    380 ; GENERIC-LABEL: test_lea_mul:
    381 ; GENERIC:       # %bb.0:
    382 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    383 ; GENERIC-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    384 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    385 ;
    386 ; ATOM-LABEL: test_lea_mul:
    387 ; ATOM:       # %bb.0:
    388 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    389 ; ATOM-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:1.00]
    390 ; ATOM-NEXT:    nop # sched: [1:0.50]
    391 ; ATOM-NEXT:    nop # sched: [1:0.50]
    392 ; ATOM-NEXT:    nop # sched: [1:0.50]
    393 ; ATOM-NEXT:    nop # sched: [1:0.50]
    394 ; ATOM-NEXT:    nop # sched: [1:0.50]
    395 ; ATOM-NEXT:    nop # sched: [1:0.50]
    396 ; ATOM-NEXT:    retq # sched: [79:39.50]
    397 ;
    398 ; SLM-LABEL: test_lea_mul:
    399 ; SLM:       # %bb.0:
    400 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    401 ; SLM-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:1.00]
    402 ; SLM-NEXT:    retq # sched: [4:1.00]
    403 ;
    404 ; SANDY-LABEL: test_lea_mul:
    405 ; SANDY:       # %bb.0:
    406 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    407 ; SANDY-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    408 ; SANDY-NEXT:    retq # sched: [1:1.00]
    409 ;
    410 ; HASWELL-LABEL: test_lea_mul:
    411 ; HASWELL:       # %bb.0:
    412 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    413 ; HASWELL-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    414 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    415 ;
    416 ; BROADWELL-LABEL: test_lea_mul:
    417 ; BROADWELL:       # %bb.0:
    418 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    419 ; BROADWELL-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    420 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    421 ;
    422 ; SKYLAKE-LABEL: test_lea_mul:
    423 ; SKYLAKE:       # %bb.0:
    424 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    425 ; SKYLAKE-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    426 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    427 ;
    428 ; BTVER2-LABEL: test_lea_mul:
    429 ; BTVER2:       # %bb.0:
    430 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    431 ; BTVER2-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [2:1.00]
    432 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    433 ;
    434 ; ZNVER1-LABEL: test_lea_mul:
    435 ; ZNVER1:       # %bb.0:
    436 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    437 ; ZNVER1-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.25]
    438 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    439   %2 = mul nsw i32 %0, 3
    440   ret i32 %2
    441 }
    442 
    443 define i32 @test_lea_mul_offset(i32) {
    444 ; GENERIC-LABEL: test_lea_mul_offset:
    445 ; GENERIC:       # %bb.0:
    446 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    447 ; GENERIC-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    448 ; GENERIC-NEXT:    addl $-32, %eax # sched: [1:0.33]
    449 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    450 ;
    451 ; ATOM-LABEL: test_lea_mul_offset:
    452 ; ATOM:       # %bb.0:
    453 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    454 ; ATOM-NEXT:    leal -32(%rdi,%rdi,2), %eax # sched: [1:1.00]
    455 ; ATOM-NEXT:    nop # sched: [1:0.50]
    456 ; ATOM-NEXT:    nop # sched: [1:0.50]
    457 ; ATOM-NEXT:    nop # sched: [1:0.50]
    458 ; ATOM-NEXT:    nop # sched: [1:0.50]
    459 ; ATOM-NEXT:    nop # sched: [1:0.50]
    460 ; ATOM-NEXT:    nop # sched: [1:0.50]
    461 ; ATOM-NEXT:    retq # sched: [79:39.50]
    462 ;
    463 ; SLM-LABEL: test_lea_mul_offset:
    464 ; SLM:       # %bb.0:
    465 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    466 ; SLM-NEXT:    leal -32(%rdi,%rdi,2), %eax # sched: [1:1.00]
    467 ; SLM-NEXT:    retq # sched: [4:1.00]
    468 ;
    469 ; SANDY-LABEL: test_lea_mul_offset:
    470 ; SANDY:       # %bb.0:
    471 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    472 ; SANDY-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    473 ; SANDY-NEXT:    addl $-32, %eax # sched: [1:0.33]
    474 ; SANDY-NEXT:    retq # sched: [1:1.00]
    475 ;
    476 ; HASWELL-LABEL: test_lea_mul_offset:
    477 ; HASWELL:       # %bb.0:
    478 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    479 ; HASWELL-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    480 ; HASWELL-NEXT:    addl $-32, %eax # sched: [1:0.25]
    481 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    482 ;
    483 ; BROADWELL-LABEL: test_lea_mul_offset:
    484 ; BROADWELL:       # %bb.0:
    485 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    486 ; BROADWELL-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    487 ; BROADWELL-NEXT:    addl $-32, %eax # sched: [1:0.25]
    488 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    489 ;
    490 ; SKYLAKE-LABEL: test_lea_mul_offset:
    491 ; SKYLAKE:       # %bb.0:
    492 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    493 ; SKYLAKE-NEXT:    leal (%rdi,%rdi,2), %eax # sched: [1:0.50]
    494 ; SKYLAKE-NEXT:    addl $-32, %eax # sched: [1:0.25]
    495 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    496 ;
    497 ; BTVER2-LABEL: test_lea_mul_offset:
    498 ; BTVER2:       # %bb.0:
    499 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    500 ; BTVER2-NEXT:    leal -32(%rdi,%rdi,2), %eax # sched: [2:1.00]
    501 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    502 ;
    503 ; ZNVER1-LABEL: test_lea_mul_offset:
    504 ; ZNVER1:       # %bb.0:
    505 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    506 ; ZNVER1-NEXT:    leal -32(%rdi,%rdi,2), %eax # sched: [1:0.25]
    507 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    508   %2 = mul nsw i32 %0, 3
    509   %3 = add nsw i32 %2, -32
    510   ret i32 %3
    511 }
    512 
    513 define i32 @test_lea_mul_offset_big(i32) {
    514 ; GENERIC-LABEL: test_lea_mul_offset_big:
    515 ; GENERIC:       # %bb.0:
    516 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    517 ; GENERIC-NEXT:    leal (%rdi,%rdi,8), %eax # sched: [1:0.50]
    518 ; GENERIC-NEXT:    addl $10000, %eax # imm = 0x2710
    519 ; GENERIC-NEXT:    # sched: [1:0.33]
    520 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    521 ;
    522 ; ATOM-LABEL: test_lea_mul_offset_big:
    523 ; ATOM:       # %bb.0:
    524 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    525 ; ATOM-NEXT:    leal 10000(%rdi,%rdi,8), %eax # sched: [1:1.00]
    526 ; ATOM-NEXT:    nop # sched: [1:0.50]
    527 ; ATOM-NEXT:    nop # sched: [1:0.50]
    528 ; ATOM-NEXT:    nop # sched: [1:0.50]
    529 ; ATOM-NEXT:    nop # sched: [1:0.50]
    530 ; ATOM-NEXT:    nop # sched: [1:0.50]
    531 ; ATOM-NEXT:    nop # sched: [1:0.50]
    532 ; ATOM-NEXT:    retq # sched: [79:39.50]
    533 ;
    534 ; SLM-LABEL: test_lea_mul_offset_big:
    535 ; SLM:       # %bb.0:
    536 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    537 ; SLM-NEXT:    leal 10000(%rdi,%rdi,8), %eax # sched: [1:1.00]
    538 ; SLM-NEXT:    retq # sched: [4:1.00]
    539 ;
    540 ; SANDY-LABEL: test_lea_mul_offset_big:
    541 ; SANDY:       # %bb.0:
    542 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    543 ; SANDY-NEXT:    leal (%rdi,%rdi,8), %eax # sched: [1:0.50]
    544 ; SANDY-NEXT:    addl $10000, %eax # imm = 0x2710
    545 ; SANDY-NEXT:    # sched: [1:0.33]
    546 ; SANDY-NEXT:    retq # sched: [1:1.00]
    547 ;
    548 ; HASWELL-LABEL: test_lea_mul_offset_big:
    549 ; HASWELL:       # %bb.0:
    550 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    551 ; HASWELL-NEXT:    leal (%rdi,%rdi,8), %eax # sched: [1:0.50]
    552 ; HASWELL-NEXT:    addl $10000, %eax # imm = 0x2710
    553 ; HASWELL-NEXT:    # sched: [1:0.25]
    554 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    555 ;
    556 ; BROADWELL-LABEL: test_lea_mul_offset_big:
    557 ; BROADWELL:       # %bb.0:
    558 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    559 ; BROADWELL-NEXT:    leal (%rdi,%rdi,8), %eax # sched: [1:0.50]
    560 ; BROADWELL-NEXT:    addl $10000, %eax # imm = 0x2710
    561 ; BROADWELL-NEXT:    # sched: [1:0.25]
    562 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    563 ;
    564 ; SKYLAKE-LABEL: test_lea_mul_offset_big:
    565 ; SKYLAKE:       # %bb.0:
    566 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    567 ; SKYLAKE-NEXT:    leal (%rdi,%rdi,8), %eax # sched: [1:0.50]
    568 ; SKYLAKE-NEXT:    addl $10000, %eax # imm = 0x2710
    569 ; SKYLAKE-NEXT:    # sched: [1:0.25]
    570 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    571 ;
    572 ; BTVER2-LABEL: test_lea_mul_offset_big:
    573 ; BTVER2:       # %bb.0:
    574 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    575 ; BTVER2-NEXT:    leal 10000(%rdi,%rdi,8), %eax # sched: [2:1.00]
    576 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    577 ;
    578 ; ZNVER1-LABEL: test_lea_mul_offset_big:
    579 ; ZNVER1:       # %bb.0:
    580 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    581 ; ZNVER1-NEXT:    leal 10000(%rdi,%rdi,8), %eax # sched: [1:0.25]
    582 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    583   %2 = mul nsw i32 %0, 9
    584   %3 = add nsw i32 %2, 10000
    585   ret i32 %3
    586 }
    587 
    588 define i32 @test_lea_add_scale(i32, i32) {
    589 ; GENERIC-LABEL: test_lea_add_scale:
    590 ; GENERIC:       # %bb.0:
    591 ; GENERIC-NEXT:    # kill: def $esi killed $esi def $rsi
    592 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    593 ; GENERIC-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [1:0.50]
    594 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    595 ;
    596 ; ATOM-LABEL: test_lea_add_scale:
    597 ; ATOM:       # %bb.0:
    598 ; ATOM-NEXT:    # kill: def $esi killed $esi def $rsi
    599 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    600 ; ATOM-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [1:1.00]
    601 ; ATOM-NEXT:    nop # sched: [1:0.50]
    602 ; ATOM-NEXT:    nop # sched: [1:0.50]
    603 ; ATOM-NEXT:    nop # sched: [1:0.50]
    604 ; ATOM-NEXT:    nop # sched: [1:0.50]
    605 ; ATOM-NEXT:    nop # sched: [1:0.50]
    606 ; ATOM-NEXT:    nop # sched: [1:0.50]
    607 ; ATOM-NEXT:    retq # sched: [79:39.50]
    608 ;
    609 ; SLM-LABEL: test_lea_add_scale:
    610 ; SLM:       # %bb.0:
    611 ; SLM-NEXT:    # kill: def $esi killed $esi def $rsi
    612 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    613 ; SLM-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [1:1.00]
    614 ; SLM-NEXT:    retq # sched: [4:1.00]
    615 ;
    616 ; SANDY-LABEL: test_lea_add_scale:
    617 ; SANDY:       # %bb.0:
    618 ; SANDY-NEXT:    # kill: def $esi killed $esi def $rsi
    619 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    620 ; SANDY-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [1:0.50]
    621 ; SANDY-NEXT:    retq # sched: [1:1.00]
    622 ;
    623 ; HASWELL-LABEL: test_lea_add_scale:
    624 ; HASWELL:       # %bb.0:
    625 ; HASWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    626 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    627 ; HASWELL-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [1:0.50]
    628 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    629 ;
    630 ; BROADWELL-LABEL: test_lea_add_scale:
    631 ; BROADWELL:       # %bb.0:
    632 ; BROADWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    633 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    634 ; BROADWELL-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [1:0.50]
    635 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    636 ;
    637 ; SKYLAKE-LABEL: test_lea_add_scale:
    638 ; SKYLAKE:       # %bb.0:
    639 ; SKYLAKE-NEXT:    # kill: def $esi killed $esi def $rsi
    640 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    641 ; SKYLAKE-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [1:0.50]
    642 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    643 ;
    644 ; BTVER2-LABEL: test_lea_add_scale:
    645 ; BTVER2:       # %bb.0:
    646 ; BTVER2-NEXT:    # kill: def $esi killed $esi def $rsi
    647 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    648 ; BTVER2-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [2:1.00]
    649 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    650 ;
    651 ; ZNVER1-LABEL: test_lea_add_scale:
    652 ; ZNVER1:       # %bb.0:
    653 ; ZNVER1-NEXT:    # kill: def $esi killed $esi def $rsi
    654 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    655 ; ZNVER1-NEXT:    leal (%rdi,%rsi,2), %eax # sched: [1:0.25]
    656 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    657   %3 = shl i32 %1, 1
    658   %4 = add nsw i32 %3, %0
    659   ret i32 %4
    660 }
    661 
    662 define i32 @test_lea_add_scale_offset(i32, i32) {
    663 ; GENERIC-LABEL: test_lea_add_scale_offset:
    664 ; GENERIC:       # %bb.0:
    665 ; GENERIC-NEXT:    # kill: def $esi killed $esi def $rsi
    666 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    667 ; GENERIC-NEXT:    leal (%rdi,%rsi,4), %eax # sched: [1:0.50]
    668 ; GENERIC-NEXT:    addl $96, %eax # sched: [1:0.33]
    669 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    670 ;
    671 ; ATOM-LABEL: test_lea_add_scale_offset:
    672 ; ATOM:       # %bb.0:
    673 ; ATOM-NEXT:    # kill: def $esi killed $esi def $rsi
    674 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    675 ; ATOM-NEXT:    leal 96(%rdi,%rsi,4), %eax # sched: [1:1.00]
    676 ; ATOM-NEXT:    nop # sched: [1:0.50]
    677 ; ATOM-NEXT:    nop # sched: [1:0.50]
    678 ; ATOM-NEXT:    nop # sched: [1:0.50]
    679 ; ATOM-NEXT:    nop # sched: [1:0.50]
    680 ; ATOM-NEXT:    nop # sched: [1:0.50]
    681 ; ATOM-NEXT:    nop # sched: [1:0.50]
    682 ; ATOM-NEXT:    retq # sched: [79:39.50]
    683 ;
    684 ; SLM-LABEL: test_lea_add_scale_offset:
    685 ; SLM:       # %bb.0:
    686 ; SLM-NEXT:    # kill: def $esi killed $esi def $rsi
    687 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    688 ; SLM-NEXT:    leal 96(%rdi,%rsi,4), %eax # sched: [1:1.00]
    689 ; SLM-NEXT:    retq # sched: [4:1.00]
    690 ;
    691 ; SANDY-LABEL: test_lea_add_scale_offset:
    692 ; SANDY:       # %bb.0:
    693 ; SANDY-NEXT:    # kill: def $esi killed $esi def $rsi
    694 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    695 ; SANDY-NEXT:    leal (%rdi,%rsi,4), %eax # sched: [1:0.50]
    696 ; SANDY-NEXT:    addl $96, %eax # sched: [1:0.33]
    697 ; SANDY-NEXT:    retq # sched: [1:1.00]
    698 ;
    699 ; HASWELL-LABEL: test_lea_add_scale_offset:
    700 ; HASWELL:       # %bb.0:
    701 ; HASWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    702 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    703 ; HASWELL-NEXT:    leal (%rdi,%rsi,4), %eax # sched: [1:0.50]
    704 ; HASWELL-NEXT:    addl $96, %eax # sched: [1:0.25]
    705 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    706 ;
    707 ; BROADWELL-LABEL: test_lea_add_scale_offset:
    708 ; BROADWELL:       # %bb.0:
    709 ; BROADWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    710 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    711 ; BROADWELL-NEXT:    leal (%rdi,%rsi,4), %eax # sched: [1:0.50]
    712 ; BROADWELL-NEXT:    addl $96, %eax # sched: [1:0.25]
    713 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    714 ;
    715 ; SKYLAKE-LABEL: test_lea_add_scale_offset:
    716 ; SKYLAKE:       # %bb.0:
    717 ; SKYLAKE-NEXT:    # kill: def $esi killed $esi def $rsi
    718 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    719 ; SKYLAKE-NEXT:    leal (%rdi,%rsi,4), %eax # sched: [1:0.50]
    720 ; SKYLAKE-NEXT:    addl $96, %eax # sched: [1:0.25]
    721 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    722 ;
    723 ; BTVER2-LABEL: test_lea_add_scale_offset:
    724 ; BTVER2:       # %bb.0:
    725 ; BTVER2-NEXT:    # kill: def $esi killed $esi def $rsi
    726 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    727 ; BTVER2-NEXT:    leal 96(%rdi,%rsi,4), %eax # sched: [2:1.00]
    728 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    729 ;
    730 ; ZNVER1-LABEL: test_lea_add_scale_offset:
    731 ; ZNVER1:       # %bb.0:
    732 ; ZNVER1-NEXT:    # kill: def $esi killed $esi def $rsi
    733 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    734 ; ZNVER1-NEXT:    leal 96(%rdi,%rsi,4), %eax # sched: [1:0.25]
    735 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    736   %3 = shl i32 %1, 2
    737   %4 = add i32 %0, 96
    738   %5 = add i32 %4, %3
    739   ret i32 %5
    740 }
    741 
    742 define i32 @test_lea_add_scale_offset_big(i32, i32) {
    743 ; GENERIC-LABEL: test_lea_add_scale_offset_big:
    744 ; GENERIC:       # %bb.0:
    745 ; GENERIC-NEXT:    # kill: def $esi killed $esi def $rsi
    746 ; GENERIC-NEXT:    # kill: def $edi killed $edi def $rdi
    747 ; GENERIC-NEXT:    leal (%rdi,%rsi,8), %eax # sched: [1:0.50]
    748 ; GENERIC-NEXT:    addl $-1200, %eax # imm = 0xFB50
    749 ; GENERIC-NEXT:    # sched: [1:0.33]
    750 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    751 ;
    752 ; ATOM-LABEL: test_lea_add_scale_offset_big:
    753 ; ATOM:       # %bb.0:
    754 ; ATOM-NEXT:    # kill: def $esi killed $esi def $rsi
    755 ; ATOM-NEXT:    # kill: def $edi killed $edi def $rdi
    756 ; ATOM-NEXT:    leal -1200(%rdi,%rsi,8), %eax # sched: [1:1.00]
    757 ; ATOM-NEXT:    nop # sched: [1:0.50]
    758 ; ATOM-NEXT:    nop # sched: [1:0.50]
    759 ; ATOM-NEXT:    nop # sched: [1:0.50]
    760 ; ATOM-NEXT:    nop # sched: [1:0.50]
    761 ; ATOM-NEXT:    nop # sched: [1:0.50]
    762 ; ATOM-NEXT:    nop # sched: [1:0.50]
    763 ; ATOM-NEXT:    retq # sched: [79:39.50]
    764 ;
    765 ; SLM-LABEL: test_lea_add_scale_offset_big:
    766 ; SLM:       # %bb.0:
    767 ; SLM-NEXT:    # kill: def $esi killed $esi def $rsi
    768 ; SLM-NEXT:    # kill: def $edi killed $edi def $rdi
    769 ; SLM-NEXT:    leal -1200(%rdi,%rsi,8), %eax # sched: [1:1.00]
    770 ; SLM-NEXT:    retq # sched: [4:1.00]
    771 ;
    772 ; SANDY-LABEL: test_lea_add_scale_offset_big:
    773 ; SANDY:       # %bb.0:
    774 ; SANDY-NEXT:    # kill: def $esi killed $esi def $rsi
    775 ; SANDY-NEXT:    # kill: def $edi killed $edi def $rdi
    776 ; SANDY-NEXT:    leal (%rdi,%rsi,8), %eax # sched: [1:0.50]
    777 ; SANDY-NEXT:    addl $-1200, %eax # imm = 0xFB50
    778 ; SANDY-NEXT:    # sched: [1:0.33]
    779 ; SANDY-NEXT:    retq # sched: [1:1.00]
    780 ;
    781 ; HASWELL-LABEL: test_lea_add_scale_offset_big:
    782 ; HASWELL:       # %bb.0:
    783 ; HASWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    784 ; HASWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    785 ; HASWELL-NEXT:    leal (%rdi,%rsi,8), %eax # sched: [1:0.50]
    786 ; HASWELL-NEXT:    addl $-1200, %eax # imm = 0xFB50
    787 ; HASWELL-NEXT:    # sched: [1:0.25]
    788 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    789 ;
    790 ; BROADWELL-LABEL: test_lea_add_scale_offset_big:
    791 ; BROADWELL:       # %bb.0:
    792 ; BROADWELL-NEXT:    # kill: def $esi killed $esi def $rsi
    793 ; BROADWELL-NEXT:    # kill: def $edi killed $edi def $rdi
    794 ; BROADWELL-NEXT:    leal (%rdi,%rsi,8), %eax # sched: [1:0.50]
    795 ; BROADWELL-NEXT:    addl $-1200, %eax # imm = 0xFB50
    796 ; BROADWELL-NEXT:    # sched: [1:0.25]
    797 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    798 ;
    799 ; SKYLAKE-LABEL: test_lea_add_scale_offset_big:
    800 ; SKYLAKE:       # %bb.0:
    801 ; SKYLAKE-NEXT:    # kill: def $esi killed $esi def $rsi
    802 ; SKYLAKE-NEXT:    # kill: def $edi killed $edi def $rdi
    803 ; SKYLAKE-NEXT:    leal (%rdi,%rsi,8), %eax # sched: [1:0.50]
    804 ; SKYLAKE-NEXT:    addl $-1200, %eax # imm = 0xFB50
    805 ; SKYLAKE-NEXT:    # sched: [1:0.25]
    806 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    807 ;
    808 ; BTVER2-LABEL: test_lea_add_scale_offset_big:
    809 ; BTVER2:       # %bb.0:
    810 ; BTVER2-NEXT:    # kill: def $esi killed $esi def $rsi
    811 ; BTVER2-NEXT:    # kill: def $edi killed $edi def $rdi
    812 ; BTVER2-NEXT:    leal -1200(%rdi,%rsi,8), %eax # sched: [2:1.00]
    813 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    814 ;
    815 ; ZNVER1-LABEL: test_lea_add_scale_offset_big:
    816 ; ZNVER1:       # %bb.0:
    817 ; ZNVER1-NEXT:    # kill: def $esi killed $esi def $rsi
    818 ; ZNVER1-NEXT:    # kill: def $edi killed $edi def $rdi
    819 ; ZNVER1-NEXT:    leal -1200(%rdi,%rsi,8), %eax # sched: [1:0.25]
    820 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    821   %3 = shl i32 %1, 3
    822   %4 = add i32 %0, -1200
    823   %5 = add i32 %4, %3
    824   ret i32 %5
    825 }
    826