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 | FileCheck %s -check-prefix=X64
      3 ; RUN: llc < %s -mtriple=i686-unknown   | FileCheck %s -check-prefix=X86
      4 
      5 define i32 @foo(i32 %a, i32 %b) local_unnamed_addr #0 {
      6 ; X64-LABEL: foo:
      7 ; X64:       # %bb.0: # %entry
      8 ; X64-NEXT:    # kill: def $esi killed $esi def $rsi
      9 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
     10 ; X64-NEXT:    leal 4(%rdi,%rsi,2), %ecx
     11 ; X64-NEXT:    leal 4(%rdi,%rsi,4), %eax
     12 ; X64-NEXT:    imull %ecx, %eax
     13 ; X64-NEXT:    retq
     14 ;
     15 ; X86-LABEL: foo:
     16 ; X86:       # %bb.0: # %entry
     17 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     18 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
     19 ; X86-NEXT:    leal 4(%ecx,%eax,2), %edx
     20 ; X86-NEXT:    leal 4(%ecx,%eax,4), %eax
     21 ; X86-NEXT:    imull %edx, %eax
     22 ; X86-NEXT:    retl
     23 entry:
     24   %mul = shl i32 %b, 1
     25   %add = add i32 %a, 4
     26   %add1 = add i32 %add, %mul
     27   %mul2 = shl i32 %b, 2
     28   %add4 = add i32 %add, %mul2
     29   %mul5 = mul nsw i32 %add1, %add4
     30   ret i32 %mul5
     31 }
     32 
     33 define i32 @foo1(i32 %a, i32 %b) local_unnamed_addr #0 {
     34 ; X64-LABEL: foo1:
     35 ; X64:       # %bb.0: # %entry
     36 ; X64-NEXT:    # kill: def $esi killed $esi def $rsi
     37 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
     38 ; X64-NEXT:    leal 4(%rdi,%rsi,4), %ecx
     39 ; X64-NEXT:    leal 4(%rdi,%rsi,8), %eax
     40 ; X64-NEXT:    imull %ecx, %eax
     41 ; X64-NEXT:    retq
     42 ;
     43 ; X86-LABEL: foo1:
     44 ; X86:       # %bb.0: # %entry
     45 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     46 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
     47 ; X86-NEXT:    leal 4(%ecx,%eax,4), %edx
     48 ; X86-NEXT:    leal 4(%ecx,%eax,8), %eax
     49 ; X86-NEXT:    imull %edx, %eax
     50 ; X86-NEXT:    retl
     51 entry:
     52   %mul = shl i32 %b, 2
     53   %add = add i32 %a, 4
     54   %add1 = add i32 %add, %mul
     55   %mul2 = shl i32 %b, 3
     56   %add4 = add i32 %add, %mul2
     57   %mul5 = mul nsw i32 %add1, %add4
     58   ret i32 %mul5
     59 }
     60 
     61 define i32 @foo1_mult_basic_blocks(i32 %a, i32 %b) local_unnamed_addr #0 {
     62 ; X64-LABEL: foo1_mult_basic_blocks:
     63 ; X64:       # %bb.0: # %entry
     64 ; X64-NEXT:    # kill: def $esi killed $esi def $rsi
     65 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
     66 ; X64-NEXT:    leal 4(%rdi,%rsi,4), %ecx
     67 ; X64-NEXT:    xorl %eax, %eax
     68 ; X64-NEXT:    cmpl $10, %ecx
     69 ; X64-NEXT:    je .LBB2_2
     70 ; X64-NEXT:  # %bb.1: # %mid
     71 ; X64-NEXT:    leal 4(%rdi,%rsi,8), %eax
     72 ; X64-NEXT:    imull %eax, %ecx
     73 ; X64-NEXT:    movl %ecx, %eax
     74 ; X64-NEXT:  .LBB2_2: # %exit
     75 ; X64-NEXT:    retq
     76 ;
     77 ; X86-LABEL: foo1_mult_basic_blocks:
     78 ; X86:       # %bb.0: # %entry
     79 ; X86-NEXT:    pushl %esi
     80 ; X86-NEXT:    .cfi_def_cfa_offset 8
     81 ; X86-NEXT:    .cfi_offset %esi, -8
     82 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
     83 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
     84 ; X86-NEXT:    leal 4(%esi,%edx,4), %ecx
     85 ; X86-NEXT:    xorl %eax, %eax
     86 ; X86-NEXT:    cmpl $10, %ecx
     87 ; X86-NEXT:    je .LBB2_2
     88 ; X86-NEXT:  # %bb.1: # %mid
     89 ; X86-NEXT:    leal 4(%esi,%edx,8), %eax
     90 ; X86-NEXT:    imull %eax, %ecx
     91 ; X86-NEXT:    movl %ecx, %eax
     92 ; X86-NEXT:  .LBB2_2: # %exit
     93 ; X86-NEXT:    popl %esi
     94 ; X86-NEXT:    .cfi_def_cfa_offset 4
     95 ; X86-NEXT:    retl
     96 entry:
     97   %mul = shl i32 %b, 2
     98   %add = add i32 %a, 4
     99   %add1 = add i32 %add, %mul
    100   %cmp = icmp ne i32 %add1 , 10
    101   br i1 %cmp , label %mid , label %exit
    102 mid:
    103   %addn = add i32 %a , 4
    104   %mul2 = shl i32 %b, 3
    105   %add4 = add i32 %addn, %mul2
    106   %mul5 = mul nsw i32 %add1, %add4
    107   br label %exit
    108 
    109 exit:
    110   %retmul = phi i32 [%mul5 , %mid] , [0 , %entry]
    111   ret i32 %retmul
    112 }
    113 
    114 define i32 @foo1_mult_basic_blocks_illegal_scale(i32 %a, i32 %b) local_unnamed_addr #0 {
    115 ; X64-LABEL: foo1_mult_basic_blocks_illegal_scale:
    116 ; X64:       # %bb.0: # %entry
    117 ; X64-NEXT:    # kill: def $esi killed $esi def $rsi
    118 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    119 ; X64-NEXT:    leal 4(%rdi,%rsi,2), %ecx
    120 ; X64-NEXT:    xorl %eax, %eax
    121 ; X64-NEXT:    cmpl $10, %ecx
    122 ; X64-NEXT:    je .LBB3_2
    123 ; X64-NEXT:  # %bb.1: # %mid
    124 ; X64-NEXT:    leal 4(%rdi,%rsi,8), %eax
    125 ; X64-NEXT:    imull %eax, %ecx
    126 ; X64-NEXT:    movl %ecx, %eax
    127 ; X64-NEXT:  .LBB3_2: # %exit
    128 ; X64-NEXT:    retq
    129 ;
    130 ; X86-LABEL: foo1_mult_basic_blocks_illegal_scale:
    131 ; X86:       # %bb.0: # %entry
    132 ; X86-NEXT:    pushl %esi
    133 ; X86-NEXT:    .cfi_def_cfa_offset 8
    134 ; X86-NEXT:    .cfi_offset %esi, -8
    135 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
    136 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
    137 ; X86-NEXT:    leal 4(%esi,%edx,2), %ecx
    138 ; X86-NEXT:    xorl %eax, %eax
    139 ; X86-NEXT:    cmpl $10, %ecx
    140 ; X86-NEXT:    je .LBB3_2
    141 ; X86-NEXT:  # %bb.1: # %mid
    142 ; X86-NEXT:    leal 4(%esi,%edx,8), %eax
    143 ; X86-NEXT:    imull %eax, %ecx
    144 ; X86-NEXT:    movl %ecx, %eax
    145 ; X86-NEXT:  .LBB3_2: # %exit
    146 ; X86-NEXT:    popl %esi
    147 ; X86-NEXT:    .cfi_def_cfa_offset 4
    148 ; X86-NEXT:    retl
    149 entry:
    150   %mul = shl i32 %b, 1
    151   %add = add i32 %a, 4
    152   %add1 = add i32 %add, %mul
    153   %cmp = icmp ne i32 %add1 , 10
    154   br i1 %cmp, label %mid , label %exit
    155 mid:
    156   %addn = add i32 %a , 4
    157   %mul2 = shl i32 %b, 3
    158   %add4 = add i32 %addn, %mul2
    159   %mul5 = mul nsw i32 %add1, %add4
    160   br label %exit
    161 exit:
    162   %retmul = phi i32 [%mul5 , %mid] , [0 , %entry]
    163   ret i32 %retmul
    164 }
    165