@@ -580,6 +580,127 @@ exit:
580
580
ret i32 %add
581
581
}
582
582
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
+
583
704
define i64 @print_mulacc_sub_extended (ptr nocapture readonly %x , ptr nocapture readonly %y , i32 %n ) {
584
705
; CHECK-LABEL: 'print_mulacc_sub_extended'
585
706
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
0 commit comments