@@ -580,6 +580,127 @@ exit:
580580 ret i32 %add
581581}
582582
583+ define i32 @print_mulacc_negated (ptr %a , ptr %b ) {
584+ ; CHECK-LABEL: 'print_mulacc_negated'
585+ ; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
586+ ; CHECK-NEXT: Live-in vp<%0> = VF
587+ ; CHECK-NEXT: Live-in vp<%1> = VF * UF
588+ ; CHECK-NEXT: Live-in vp<%2> = vector-trip-count
589+ ; CHECK-NEXT: Live-in ir<1024> = original trip-count
590+ ; CHECK-EMPTY:
591+ ; CHECK-NEXT: ir-bb<entry>:
592+ ; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
593+ ; CHECK-EMPTY:
594+ ; CHECK-NEXT: vector.ph:
595+ ; CHECK-NEXT: EMIT vp<%3> = reduction-start-vector ir<0>, ir<0>, ir<1>
596+ ; CHECK-NEXT: Successor(s): vector loop
597+ ; CHECK-EMPTY:
598+ ; CHECK-NEXT: <x1> vector loop: {
599+ ; CHECK-NEXT: vector.body:
600+ ; CHECK-NEXT: EMIT vp<%4> = CANONICAL-INDUCTION ir<0>, vp<%index.next>
601+ ; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<%accum> = phi vp<%3>, vp<%8>
602+ ; CHECK-NEXT: vp<%5> = SCALAR-STEPS vp<%4>, ir<1>, vp<%0>
603+ ; CHECK-NEXT: CLONE ir<%gep.a> = getelementptr ir<%a>, vp<%5>
604+ ; CHECK-NEXT: vp<%6> = vector-pointer ir<%gep.a>
605+ ; CHECK-NEXT: WIDEN ir<%load.a> = load vp<%6>
606+ ; CHECK-NEXT: CLONE ir<%gep.b> = getelementptr ir<%b>, vp<%5>
607+ ; CHECK-NEXT: vp<%7> = vector-pointer ir<%gep.b>
608+ ; CHECK-NEXT: WIDEN ir<%load.b> = load vp<%7>
609+ ; CHECK-NEXT: EXPRESSION vp<%8> = ir<%accum> + reduce.add (sub (0, mul (ir<%load.b> zext to i32), (ir<%load.a> zext to i32)))
610+ ; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<%4>, vp<%1>
611+ ; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, vp<%2>
612+ ; CHECK-NEXT: No successors
613+ ; CHECK-NEXT: }
614+ ; CHECK-NEXT: Successor(s): middle.block
615+ ; CHECK-EMPTY:
616+ ; CHECK-NEXT: middle.block:
617+ ; CHECK-NEXT: EMIT vp<%10> = compute-reduction-result ir<%accum>, vp<%8>
618+ ; CHECK-NEXT: EMIT vp<%cmp.n> = icmp eq ir<1024>, vp<%2>
619+ ; CHECK-NEXT: EMIT branch-on-cond vp<%cmp.n>
620+ ; CHECK-NEXT: Successor(s): ir-bb<exit>, scalar.ph
621+ ; CHECK-EMPTY:
622+ ; CHECK-NEXT: ir-bb<exit>:
623+ ; CHECK-NEXT: IR %add.lcssa = phi i32 [ %add, %loop ] (extra operand: vp<%10> from middle.block)
624+ ; CHECK-NEXT: No successors
625+ ; CHECK-EMPTY:
626+ ; CHECK-NEXT: scalar.ph:
627+ ; CHECK-NEXT: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<%2>, middle.block ], [ ir<0>, ir-bb<entry> ]
628+ ; CHECK-NEXT: EMIT-SCALAR vp<%bc.merge.rdx> = phi [ vp<%10>, middle.block ], [ ir<0>, ir-bb<entry> ]
629+ ; CHECK-NEXT: Successor(s): ir-bb<loop>
630+ ; CHECK-EMPTY:
631+ ; CHECK-NEXT: ir-bb<loop>:
632+ ; CHECK-NEXT: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] (extra operand: vp<%bc.resume.val> from scalar.ph)
633+ ; CHECK-NEXT: IR %accum = phi i32 [ 0, %entry ], [ %add, %loop ] (extra operand: vp<%bc.merge.rdx> from scalar.ph)
634+ ; CHECK-NEXT: IR %gep.a = getelementptr i8, ptr %a, i64 %iv
635+ ; CHECK-NEXT: IR %load.a = load i8, ptr %gep.a, align 1
636+ ; CHECK-NEXT: IR %ext.a = zext i8 %load.a to i32
637+ ; CHECK-NEXT: IR %gep.b = getelementptr i8, ptr %b, i64 %iv
638+ ; CHECK-NEXT: IR %load.b = load i8, ptr %gep.b, align 1
639+ ; CHECK-NEXT: IR %ext.b = zext i8 %load.b to i32
640+ ; CHECK-NEXT: IR %mul = mul i32 %ext.b, %ext.a
641+ ; CHECK-NEXT: IR %sub = sub i32 0, %mul
642+ ; CHECK-NEXT: IR %add = add i32 %accum, %sub
643+ ; CHECK-NEXT: IR %iv.next = add i64 %iv, 1
644+ ; CHECK-NEXT: IR %exitcond.not = icmp eq i64 %iv.next, 1024
645+ ; CHECK-NEXT: No successors
646+ ; CHECK-NEXT: }
647+ ; CHECK: VPlan 'Final VPlan for VF={4},UF={1}' {
648+ ; CHECK-NEXT: Live-in ir<1024> = vector-trip-count
649+ ; CHECK-NEXT: Live-in ir<1024> = original trip-count
650+ ; CHECK-EMPTY:
651+ ; CHECK-NEXT: ir-bb<entry>:
652+ ; CHECK-NEXT: Successor(s): vector.ph
653+ ; CHECK-EMPTY:
654+ ; CHECK-NEXT: vector.ph:
655+ ; CHECK-NEXT: Successor(s): vector.body
656+ ; CHECK-EMPTY:
657+ ; CHECK-NEXT: vector.body:
658+ ; CHECK-NEXT: EMIT-SCALAR vp<%index> = phi [ ir<0>, vector.ph ], [ vp<%index.next>, vector.body ]
659+ ; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<%accum> = phi ir<0>, ir<%add>
660+ ; CHECK-NEXT: CLONE ir<%gep.a> = getelementptr ir<%a>, vp<%index>
661+ ; CHECK-NEXT: WIDEN ir<%load.a> = load ir<%gep.a>
662+ ; CHECK-NEXT: CLONE ir<%gep.b> = getelementptr ir<%b>, vp<%index>
663+ ; CHECK-NEXT: WIDEN ir<%load.b> = load ir<%gep.b>
664+ ; CHECK-NEXT: WIDEN-CAST ir<%ext.b> = zext ir<%load.b> to i32
665+ ; CHECK-NEXT: WIDEN-CAST ir<%ext.a> = zext ir<%load.a> to i32
666+ ; CHECK-NEXT: WIDEN ir<%mul> = mul ir<%ext.b>, ir<%ext.a>
667+ ; CHECK-NEXT: WIDEN ir<%sub> = sub ir<0>, ir<%mul>
668+ ; CHECK-NEXT: REDUCE ir<%add> = ir<%accum> + reduce.add (ir<%sub>)
669+ ; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<%index>, ir<4>
670+ ; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, ir<1024>
671+ ; CHECK-NEXT: Successor(s): middle.block, vector.body
672+ ; CHECK-EMPTY:
673+ ; CHECK-NEXT: middle.block:
674+ ; CHECK-NEXT: EMIT vp<[[RED_RESULT:%.+]]> = compute-reduction-result ir<%accum>, ir<%add>
675+ ; CHECK-NEXT: Successor(s): ir-bb<exit>
676+ ; CHECK-EMPTY:
677+ ; CHECK-NEXT: ir-bb<exit>:
678+ ; CHECK-NEXT: IR %add.lcssa = phi i32 [ %add, %loop ] (extra operand: vp<[[RED_RESULT]]> from middle.block)
679+ ; CHECK-NEXT: No successors
680+ ; CHECK-NEXT: }
681+ entry:
682+ br label %loop
683+
684+ loop:
685+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
686+ %accum = phi i32 [ 0 , %entry ], [ %add , %loop ]
687+ %gep.a = getelementptr i8 , ptr %a , i64 %iv
688+ %load.a = load i8 , ptr %gep.a , align 1
689+ %ext.a = zext i8 %load.a to i32
690+ %gep.b = getelementptr i8 , ptr %b , i64 %iv
691+ %load.b = load i8 , ptr %gep.b , align 1
692+ %ext.b = zext i8 %load.b to i32
693+ %mul = mul i32 %ext.b , %ext.a
694+ %sub = sub i32 0 , %mul
695+ %add = add i32 %accum , %sub
696+ %iv.next = add i64 %iv , 1
697+ %exitcond.not = icmp eq i64 %iv.next , 1024
698+ br i1 %exitcond.not , label %exit , label %loop
699+
700+ exit:
701+ ret i32 %add
702+ }
703+
583704define i64 @print_mulacc_sub_extended (ptr nocapture readonly %x , ptr nocapture readonly %y , i32 %n ) {
584705; CHECK-LABEL: 'print_mulacc_sub_extended'
585706; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
0 commit comments