394 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --implicit-check-not '{{and|movz|sar|shl}}'3 4; Optimize away zext-inreg and sext-inreg on the loop induction5; variable using trip-count information.6 7define void @count_up(ptr %d, i64 %n) nounwind {8; CHECK-LABEL: count_up:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: movq $-80, %rax11; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]12; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]13; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]14; CHECK-NEXT: .p2align 415; CHECK-NEXT: .LBB0_1: # %loop16; CHECK-NEXT: # =>This Inner Loop Header: Depth=117; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero18; CHECK-NEXT: mulsd %xmm0, %xmm319; CHECK-NEXT: mulsd %xmm1, %xmm320; CHECK-NEXT: mulsd %xmm2, %xmm321; CHECK-NEXT: movsd %xmm3, 80(%rdi,%rax)22; CHECK-NEXT: addq $8, %rax23; CHECK-NEXT: jne .LBB0_124; CHECK-NEXT: # %bb.2: # %return25; CHECK-NEXT: retq26entry:27 br label %loop28 29loop:30 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]31 %indvar.i8 = and i64 %indvar, 25532 %t0 = getelementptr double, ptr %d, i64 %indvar.i833 %t1 = load double, ptr %t034 %t2 = fmul double %t1, 0.135 store double %t2, ptr %t036 %indvar.i24 = and i64 %indvar, 1677721537 %t3 = getelementptr double, ptr %d, i64 %indvar.i2438 %t4 = load double, ptr %t339 %t5 = fmul double %t4, 2.340 store double %t5, ptr %t341 %t6 = getelementptr double, ptr %d, i64 %indvar42 %t7 = load double, ptr %t643 %t8 = fmul double %t7, 4.544 store double %t8, ptr %t645 %indvar.next = add i64 %indvar, 146 %exitcond = icmp eq i64 %indvar.next, 1047 br i1 %exitcond, label %return, label %loop48 49return:50 ret void51}52 53define void @count_down(ptr %d, i64 %n) nounwind {54; CHECK-LABEL: count_down:55; CHECK: # %bb.0: # %entry56; CHECK-NEXT: movl $80, %eax57; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]58; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]59; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]60; CHECK-NEXT: .p2align 461; CHECK-NEXT: .LBB1_1: # %loop62; CHECK-NEXT: # =>This Inner Loop Header: Depth=163; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero64; CHECK-NEXT: mulsd %xmm0, %xmm365; CHECK-NEXT: mulsd %xmm1, %xmm366; CHECK-NEXT: mulsd %xmm2, %xmm367; CHECK-NEXT: movsd %xmm3, (%rdi,%rax)68; CHECK-NEXT: addq $-8, %rax69; CHECK-NEXT: jne .LBB1_170; CHECK-NEXT: # %bb.2: # %return71; CHECK-NEXT: retq72entry:73 br label %loop74 75loop:76 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]77 %indvar.i8 = and i64 %indvar, 25578 %t0 = getelementptr double, ptr %d, i64 %indvar.i879 %t1 = load double, ptr %t080 %t2 = fmul double %t1, 0.181 store double %t2, ptr %t082 %indvar.i24 = and i64 %indvar, 1677721583 %t3 = getelementptr double, ptr %d, i64 %indvar.i2484 %t4 = load double, ptr %t385 %t5 = fmul double %t4, 2.386 store double %t5, ptr %t387 %t6 = getelementptr double, ptr %d, i64 %indvar88 %t7 = load double, ptr %t689 %t8 = fmul double %t7, 4.590 store double %t8, ptr %t691 %indvar.next = sub i64 %indvar, 192 %exitcond = icmp eq i64 %indvar.next, 093 br i1 %exitcond, label %return, label %loop94 95return:96 ret void97}98 99define void @count_up_signed(ptr %d, i64 %n) nounwind {100; CHECK-LABEL: count_up_signed:101; CHECK: # %bb.0: # %entry102; CHECK-NEXT: movq $-80, %rax103; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]104; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]105; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]106; CHECK-NEXT: .p2align 4107; CHECK-NEXT: .LBB2_1: # %loop108; CHECK-NEXT: # =>This Inner Loop Header: Depth=1109; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero110; CHECK-NEXT: mulsd %xmm0, %xmm3111; CHECK-NEXT: mulsd %xmm1, %xmm3112; CHECK-NEXT: mulsd %xmm2, %xmm3113; CHECK-NEXT: movsd %xmm3, 80(%rdi,%rax)114; CHECK-NEXT: addq $8, %rax115; CHECK-NEXT: jne .LBB2_1116; CHECK-NEXT: # %bb.2: # %return117; CHECK-NEXT: retq118entry:119 br label %loop120 121loop:122 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]123 %s0 = shl i64 %indvar, 8124 %indvar.i8 = ashr i64 %s0, 8125 %t0 = getelementptr double, ptr %d, i64 %indvar.i8126 %t1 = load double, ptr %t0127 %t2 = fmul double %t1, 0.1128 store double %t2, ptr %t0129 %s1 = shl i64 %indvar, 24130 %indvar.i24 = ashr i64 %s1, 24131 %t3 = getelementptr double, ptr %d, i64 %indvar.i24132 %t4 = load double, ptr %t3133 %t5 = fmul double %t4, 2.3134 store double %t5, ptr %t3135 %t6 = getelementptr double, ptr %d, i64 %indvar136 %t7 = load double, ptr %t6137 %t8 = fmul double %t7, 4.5138 store double %t8, ptr %t6139 %indvar.next = add i64 %indvar, 1140 %exitcond = icmp eq i64 %indvar.next, 10141 br i1 %exitcond, label %return, label %loop142 143return:144 ret void145}146 147define void @count_down_signed(ptr %d, i64 %n) nounwind {148; CHECK-LABEL: count_down_signed:149; CHECK: # %bb.0: # %entry150; CHECK-NEXT: movl $80, %eax151; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]152; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]153; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]154; CHECK-NEXT: .p2align 4155; CHECK-NEXT: .LBB3_1: # %loop156; CHECK-NEXT: # =>This Inner Loop Header: Depth=1157; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero158; CHECK-NEXT: mulsd %xmm0, %xmm3159; CHECK-NEXT: mulsd %xmm1, %xmm3160; CHECK-NEXT: mulsd %xmm2, %xmm3161; CHECK-NEXT: movsd %xmm3, (%rdi,%rax)162; CHECK-NEXT: addq $-8, %rax163; CHECK-NEXT: jne .LBB3_1164; CHECK-NEXT: # %bb.2: # %return165; CHECK-NEXT: retq166entry:167 br label %loop168 169loop:170 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]171 %s0 = shl i64 %indvar, 8172 %indvar.i8 = ashr i64 %s0, 8173 %t0 = getelementptr double, ptr %d, i64 %indvar.i8174 %t1 = load double, ptr %t0175 %t2 = fmul double %t1, 0.1176 store double %t2, ptr %t0177 %s1 = shl i64 %indvar, 24178 %indvar.i24 = ashr i64 %s1, 24179 %t3 = getelementptr double, ptr %d, i64 %indvar.i24180 %t4 = load double, ptr %t3181 %t5 = fmul double %t4, 2.3182 store double %t5, ptr %t3183 %t6 = getelementptr double, ptr %d, i64 %indvar184 %t7 = load double, ptr %t6185 %t8 = fmul double %t7, 4.5186 store double %t8, ptr %t6187 %indvar.next = sub i64 %indvar, 1188 %exitcond = icmp eq i64 %indvar.next, 0189 br i1 %exitcond, label %return, label %loop190 191return:192 ret void193}194 195define void @another_count_up(ptr %d, i64 %n) nounwind {196; CHECK-LABEL: another_count_up:197; CHECK: # %bb.0: # %entry198; CHECK-NEXT: movq $-8, %rax199; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]200; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]201; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]202; CHECK-NEXT: .p2align 4203; CHECK-NEXT: .LBB4_1: # %loop204; CHECK-NEXT: # =>This Inner Loop Header: Depth=1205; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero206; CHECK-NEXT: mulsd %xmm0, %xmm3207; CHECK-NEXT: movsd %xmm3, 2048(%rdi,%rax)208; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero209; CHECK-NEXT: mulsd %xmm1, %xmm3210; CHECK-NEXT: movsd %xmm3, 134217728(%rdi,%rax)211; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero212; CHECK-NEXT: mulsd %xmm2, %xmm3213; CHECK-NEXT: movsd %xmm3, (%rdi,%rax)214; CHECK-NEXT: addq $8, %rax215; CHECK-NEXT: jne .LBB4_1216; CHECK-NEXT: # %bb.2: # %return217; CHECK-NEXT: retq218entry:219 br label %loop220 221loop:222 %indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]223 %indvar.i8 = and i64 %indvar, 255224 %t0 = getelementptr double, ptr %d, i64 %indvar.i8225 %t1 = load double, ptr %t0226 %t2 = fmul double %t1, 0.1227 store double %t2, ptr %t0228 %indvar.i24 = and i64 %indvar, 16777215229 %t3 = getelementptr double, ptr %d, i64 %indvar.i24230 %t4 = load double, ptr %t3231 %t5 = fmul double %t4, 2.3232 store double %t5, ptr %t3233 %t6 = getelementptr double, ptr %d, i64 %indvar234 %t7 = load double, ptr %t6235 %t8 = fmul double %t7, 4.5236 store double %t8, ptr %t6237 %indvar.next = add i64 %indvar, 1238 %exitcond = icmp eq i64 %indvar.next, 0239 br i1 %exitcond, label %return, label %loop240 241return:242 ret void243}244 245define void @another_count_down(ptr %d, i64 %n) nounwind {246; CHECK-LABEL: another_count_down:247; CHECK: # %bb.0: # %entry248; CHECK-NEXT: movq $-2040, %rax # imm = 0xF808249; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]250; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]251; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]252; CHECK-NEXT: movq %rdi, %rcx253; CHECK-NEXT: movq %rdi, %rdx254; CHECK-NEXT: .p2align 4255; CHECK-NEXT: .LBB5_1: # %loop256; CHECK-NEXT: # =>This Inner Loop Header: Depth=1257; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero258; CHECK-NEXT: mulsd %xmm0, %xmm3259; CHECK-NEXT: movsd %xmm3, 2040(%rdi,%rax)260; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero261; CHECK-NEXT: divsd %xmm1, %xmm3262; CHECK-NEXT: movsd %xmm3, (%rcx)263; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero264; CHECK-NEXT: mulsd %xmm2, %xmm3265; CHECK-NEXT: movsd %xmm3, (%rdx)266; CHECK-NEXT: addq $-8, %rdx267; CHECK-NEXT: addq $134217720, %rcx # imm = 0x7FFFFF8268; CHECK-NEXT: addq $2040, %rax # imm = 0x7F8269; CHECK-NEXT: jne .LBB5_1270; CHECK-NEXT: # %bb.2: # %return271; CHECK-NEXT: retq272entry:273 br label %loop274 275loop:276 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]277 %indvar.i8 = and i64 %indvar, 255278 %t0 = getelementptr double, ptr %d, i64 %indvar.i8279 %t1 = load double, ptr %t0280 %t2 = fmul double %t1, 0.1281 store double %t2, ptr %t0282 %indvar.i24 = and i64 %indvar, 16777215283 %t3 = getelementptr double, ptr %d, i64 %indvar.i24284 %t4 = load double, ptr %t3285 %t5 = fdiv double %t4, 2.3286 store double %t5, ptr %t3287 %t6 = getelementptr double, ptr %d, i64 %indvar288 %t7 = load double, ptr %t6289 %t8 = fmul double %t7, 4.5290 store double %t8, ptr %t6291 %indvar.next = sub i64 %indvar, 1292 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615293 br i1 %exitcond, label %return, label %loop294 295return:296 ret void297}298 299define void @another_count_up_signed(ptr %d, i64 %n) nounwind {300; CHECK-LABEL: another_count_up_signed:301; CHECK: # %bb.0: # %entry302; CHECK-NEXT: movq $-8, %rax303; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]304; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]305; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]306; CHECK-NEXT: .p2align 4307; CHECK-NEXT: .LBB6_1: # %loop308; CHECK-NEXT: # =>This Inner Loop Header: Depth=1309; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero310; CHECK-NEXT: mulsd %xmm0, %xmm3311; CHECK-NEXT: divsd %xmm1, %xmm3312; CHECK-NEXT: mulsd %xmm2, %xmm3313; CHECK-NEXT: movsd %xmm3, (%rdi,%rax)314; CHECK-NEXT: addq $8, %rax315; CHECK-NEXT: jne .LBB6_1316; CHECK-NEXT: # %bb.2: # %return317; CHECK-NEXT: retq318entry:319 br label %loop320 321loop:322 %indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]323 %s0 = shl i64 %indvar, 8324 %indvar.i8 = ashr i64 %s0, 8325 %t0 = getelementptr double, ptr %d, i64 %indvar.i8326 %t1 = load double, ptr %t0327 %t2 = fmul double %t1, 0.1328 store double %t2, ptr %t0329 %s1 = shl i64 %indvar, 24330 %indvar.i24 = ashr i64 %s1, 24331 %t3 = getelementptr double, ptr %d, i64 %indvar.i24332 %t4 = load double, ptr %t3333 %t5 = fdiv double %t4, 2.3334 store double %t5, ptr %t3335 %t6 = getelementptr double, ptr %d, i64 %indvar336 %t7 = load double, ptr %t6337 %t8 = fmul double %t7, 4.5338 store double %t8, ptr %t6339 %indvar.next = add i64 %indvar, 1340 %exitcond = icmp eq i64 %indvar.next, 0341 br i1 %exitcond, label %return, label %loop342 343return:344 ret void345}346 347define void @another_count_down_signed(ptr %d, i64 %n) nounwind {348; CHECK-LABEL: another_count_down_signed:349; CHECK: # %bb.0: # %entry350; CHECK-NEXT: movl $8, %eax351; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]352; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]353; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]354; CHECK-NEXT: .p2align 4355; CHECK-NEXT: .LBB7_1: # %loop356; CHECK-NEXT: # =>This Inner Loop Header: Depth=1357; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero358; CHECK-NEXT: mulsd %xmm0, %xmm3359; CHECK-NEXT: divsd %xmm1, %xmm3360; CHECK-NEXT: mulsd %xmm2, %xmm3361; CHECK-NEXT: movsd %xmm3, -8(%rdi,%rax)362; CHECK-NEXT: addq $-8, %rax363; CHECK-NEXT: jne .LBB7_1364; CHECK-NEXT: # %bb.2: # %return365; CHECK-NEXT: retq366entry:367 br label %loop368 369loop:370 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]371 %s0 = shl i64 %indvar, 8372 %indvar.i8 = ashr i64 %s0, 8373 %t0 = getelementptr double, ptr %d, i64 %indvar.i8374 %t1 = load double, ptr %t0375 %t2 = fmul double %t1, 0.1376 store double %t2, ptr %t0377 %s1 = shl i64 %indvar, 24378 %indvar.i24 = ashr i64 %s1, 24379 %t3 = getelementptr double, ptr %d, i64 %indvar.i24380 %t4 = load double, ptr %t3381 %t5 = fdiv double %t4, 2.3382 store double %t5, ptr %t3383 %t6 = getelementptr double, ptr %d, i64 %indvar384 %t7 = load double, ptr %t6385 %t8 = fmul double %t7, 4.5386 store double %t8, ptr %t6387 %indvar.next = sub i64 %indvar, 1388 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615389 br i1 %exitcond, label %return, label %loop390 391return:392 ret void393}394