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