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 14define void @count_up(double* %d, i64 %n) nounwind { 15entry: 16 br label %loop 17 18loop: 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 38return: 39 ret void 40} 41 42define void @count_down(double* %d, i64 %n) nounwind { 43entry: 44 br label %loop 45 46loop: 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 66return: 67 ret void 68} 69 70define void @count_up_signed(double* %d, i64 %n) nounwind { 71entry: 72 br label %loop 73 74loop: 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 96return: 97 ret void 98} 99 100define void @count_down_signed(double* %d, i64 %n) nounwind { 101entry: 102 br label %loop 103 104loop: 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 126return: 127 ret void 128} 129 130define void @another_count_up(double* %d, i64 %n) nounwind { 131entry: 132 br label %loop 133 134loop: 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 154return: 155 ret void 156} 157 158define void @another_count_down(double* %d, i64 %n) nounwind { 159entry: 160 br label %loop 161 162loop: 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 182return: 183 ret void 184} 185 186define void @another_count_up_signed(double* %d, i64 %n) nounwind { 187entry: 188 br label %loop 189 190loop: 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 212return: 213 ret void 214} 215 216define void @another_count_down_signed(double* %d, i64 %n) nounwind { 217entry: 218 br label %loop 219 220loop: 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 242return: 243 ret void 244} 245