Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mcpu=generic -march=x86-64 > %t
      2 ; RUN: not grep and %t
      3 ; RUN: not grep movz %t
      4 ; RUN: not grep sar %t
      5 ; RUN: not grep shl %t
      6 ; RUN: grep add %t | count 5
      7 ; RUN: grep inc %t | count 2
      8 ; RUN: grep lea %t | count 3
      9 
     10 ; Optimize away zext-inreg and sext-inreg on the loop induction
     11 ; variable using trip-count information.
     12 
     13 define void @count_up(double* %d, i64 %n) nounwind {
     14 entry:
     15 	br label %loop
     16 
     17 loop:
     18 	%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
     19 	%indvar.i8 = and i64 %indvar, 255
     20 	%t0 = getelementptr double* %d, i64 %indvar.i8
     21 	%t1 = load double* %t0
     22 	%t2 = fmul double %t1, 0.1
     23 	store double %t2, double* %t0
     24 	%indvar.i24 = and i64 %indvar, 16777215
     25 	%t3 = getelementptr double* %d, i64 %indvar.i24
     26 	%t4 = load double* %t3
     27 	%t5 = fmul double %t4, 2.3
     28 	store double %t5, double* %t3
     29 	%t6 = getelementptr double* %d, i64 %indvar
     30 	%t7 = load double* %t6
     31 	%t8 = fmul double %t7, 4.5
     32 	store double %t8, double* %t6
     33 	%indvar.next = add i64 %indvar, 1
     34 	%exitcond = icmp eq i64 %indvar.next, 10
     35 	br i1 %exitcond, label %return, label %loop
     36 
     37 return:
     38 	ret void
     39 }
     40 
     41 define void @count_down(double* %d, i64 %n) nounwind {
     42 entry:
     43 	br label %loop
     44 
     45 loop:
     46 	%indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
     47 	%indvar.i8 = and i64 %indvar, 255
     48 	%t0 = getelementptr double* %d, i64 %indvar.i8
     49 	%t1 = load double* %t0
     50 	%t2 = fmul double %t1, 0.1
     51 	store double %t2, double* %t0
     52 	%indvar.i24 = and i64 %indvar, 16777215
     53 	%t3 = getelementptr double* %d, i64 %indvar.i24
     54 	%t4 = load double* %t3
     55 	%t5 = fmul double %t4, 2.3
     56 	store double %t5, double* %t3
     57 	%t6 = getelementptr double* %d, i64 %indvar
     58 	%t7 = load double* %t6
     59 	%t8 = fmul double %t7, 4.5
     60 	store double %t8, double* %t6
     61 	%indvar.next = sub i64 %indvar, 1
     62 	%exitcond = icmp eq i64 %indvar.next, 0
     63 	br i1 %exitcond, label %return, label %loop
     64 
     65 return:
     66 	ret void
     67 }
     68 
     69 define void @count_up_signed(double* %d, i64 %n) nounwind {
     70 entry:
     71 	br label %loop
     72 
     73 loop:
     74 	%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
     75         %s0 = shl i64 %indvar, 8
     76 	%indvar.i8 = ashr i64 %s0, 8
     77 	%t0 = getelementptr double* %d, i64 %indvar.i8
     78 	%t1 = load double* %t0
     79 	%t2 = fmul double %t1, 0.1
     80 	store double %t2, double* %t0
     81 	%s1 = shl i64 %indvar, 24
     82 	%indvar.i24 = ashr i64 %s1, 24
     83 	%t3 = getelementptr double* %d, i64 %indvar.i24
     84 	%t4 = load double* %t3
     85 	%t5 = fmul double %t4, 2.3
     86 	store double %t5, double* %t3
     87 	%t6 = getelementptr double* %d, i64 %indvar
     88 	%t7 = load double* %t6
     89 	%t8 = fmul double %t7, 4.5
     90 	store double %t8, double* %t6
     91 	%indvar.next = add i64 %indvar, 1
     92 	%exitcond = icmp eq i64 %indvar.next, 10
     93 	br i1 %exitcond, label %return, label %loop
     94 
     95 return:
     96 	ret void
     97 }
     98 
     99 define void @count_down_signed(double* %d, i64 %n) nounwind {
    100 entry:
    101 	br label %loop
    102 
    103 loop:
    104 	%indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
    105         %s0 = shl i64 %indvar, 8
    106 	%indvar.i8 = ashr i64 %s0, 8
    107 	%t0 = getelementptr double* %d, i64 %indvar.i8
    108 	%t1 = load double* %t0
    109 	%t2 = fmul double %t1, 0.1
    110 	store double %t2, double* %t0
    111 	%s1 = shl i64 %indvar, 24
    112 	%indvar.i24 = ashr i64 %s1, 24
    113 	%t3 = getelementptr double* %d, i64 %indvar.i24
    114 	%t4 = load double* %t3
    115 	%t5 = fmul double %t4, 2.3
    116 	store double %t5, double* %t3
    117 	%t6 = getelementptr double* %d, i64 %indvar
    118 	%t7 = load double* %t6
    119 	%t8 = fmul double %t7, 4.5
    120 	store double %t8, double* %t6
    121 	%indvar.next = sub i64 %indvar, 1
    122 	%exitcond = icmp eq i64 %indvar.next, 0
    123 	br i1 %exitcond, label %return, label %loop
    124 
    125 return:
    126 	ret void
    127 }
    128 
    129 define void @another_count_up(double* %d, i64 %n) nounwind {
    130 entry:
    131 	br label %loop
    132 
    133 loop:
    134 	%indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
    135 	%indvar.i8 = and i64 %indvar, 255
    136 	%t0 = getelementptr double* %d, i64 %indvar.i8
    137 	%t1 = load double* %t0
    138 	%t2 = fmul double %t1, 0.1
    139 	store double %t2, double* %t0
    140 	%indvar.i24 = and i64 %indvar, 16777215
    141 	%t3 = getelementptr double* %d, i64 %indvar.i24
    142 	%t4 = load double* %t3
    143 	%t5 = fmul double %t4, 2.3
    144 	store double %t5, double* %t3
    145 	%t6 = getelementptr double* %d, i64 %indvar
    146 	%t7 = load double* %t6
    147 	%t8 = fmul double %t7, 4.5
    148 	store double %t8, double* %t6
    149 	%indvar.next = add i64 %indvar, 1
    150 	%exitcond = icmp eq i64 %indvar.next, 0
    151 	br i1 %exitcond, label %return, label %loop
    152 
    153 return:
    154 	ret void
    155 }
    156 
    157 define void @another_count_down(double* %d, i64 %n) nounwind {
    158 entry:
    159 	br label %loop
    160 
    161 loop:
    162 	%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
    163 	%indvar.i8 = and i64 %indvar, 255
    164 	%t0 = getelementptr double* %d, i64 %indvar.i8
    165 	%t1 = load double* %t0
    166 	%t2 = fmul double %t1, 0.1
    167 	store double %t2, double* %t0
    168 	%indvar.i24 = and i64 %indvar, 16777215
    169 	%t3 = getelementptr double* %d, i64 %indvar.i24
    170 	%t4 = load double* %t3
    171 	%t5 = fdiv double %t4, 2.3
    172 	store double %t5, double* %t3
    173 	%t6 = getelementptr double* %d, i64 %indvar
    174 	%t7 = load double* %t6
    175 	%t8 = fmul double %t7, 4.5
    176 	store double %t8, double* %t6
    177 	%indvar.next = sub i64 %indvar, 1
    178 	%exitcond = icmp eq i64 %indvar.next, 18446744073709551615
    179 	br i1 %exitcond, label %return, label %loop
    180 
    181 return:
    182 	ret void
    183 }
    184 
    185 define void @another_count_up_signed(double* %d, i64 %n) nounwind {
    186 entry:
    187 	br label %loop
    188 
    189 loop:
    190 	%indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
    191         %s0 = shl i64 %indvar, 8
    192 	%indvar.i8 = ashr i64 %s0, 8
    193 	%t0 = getelementptr double* %d, i64 %indvar.i8
    194 	%t1 = load double* %t0
    195 	%t2 = fmul double %t1, 0.1
    196 	store double %t2, double* %t0
    197 	%s1 = shl i64 %indvar, 24
    198 	%indvar.i24 = ashr i64 %s1, 24
    199 	%t3 = getelementptr double* %d, i64 %indvar.i24
    200 	%t4 = load double* %t3
    201 	%t5 = fdiv double %t4, 2.3
    202 	store double %t5, double* %t3
    203 	%t6 = getelementptr double* %d, i64 %indvar
    204 	%t7 = load double* %t6
    205 	%t8 = fmul double %t7, 4.5
    206 	store double %t8, double* %t6
    207 	%indvar.next = add i64 %indvar, 1
    208 	%exitcond = icmp eq i64 %indvar.next, 0
    209 	br i1 %exitcond, label %return, label %loop
    210 
    211 return:
    212 	ret void
    213 }
    214 
    215 define void @another_count_down_signed(double* %d, i64 %n) nounwind {
    216 entry:
    217 	br label %loop
    218 
    219 loop:
    220 	%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
    221         %s0 = shl i64 %indvar, 8
    222 	%indvar.i8 = ashr i64 %s0, 8
    223 	%t0 = getelementptr double* %d, i64 %indvar.i8
    224 	%t1 = load double* %t0
    225 	%t2 = fmul double %t1, 0.1
    226 	store double %t2, double* %t0
    227 	%s1 = shl i64 %indvar, 24
    228 	%indvar.i24 = ashr i64 %s1, 24
    229 	%t3 = getelementptr double* %d, i64 %indvar.i24
    230 	%t4 = load double* %t3
    231 	%t5 = fdiv double %t4, 2.3
    232 	store double %t5, double* %t3
    233 	%t6 = getelementptr double* %d, i64 %indvar
    234 	%t7 = load double* %t6
    235 	%t8 = fmul double %t7, 4.5
    236 	store double %t8, double* %t6
    237 	%indvar.next = sub i64 %indvar, 1
    238 	%exitcond = icmp eq i64 %indvar.next, 18446744073709551615
    239 	br i1 %exitcond, label %return, label %loop
    240 
    241 return:
    242 	ret void
    243 }
    244