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