Skip to content

Commit 99b0078

Browse files
committed
[AArch64] Tests for showing MachineCombiner COPY patterns. NFC
1 parent 5cde5a5 commit 99b0078

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=aarch64-linux-gnuabi -mattr=+fullfp16 -O3 | FileCheck %s
3+
4+
define void @fma_dup_f16(ptr noalias nocapture noundef readonly %A, half noundef %B, ptr noalias nocapture noundef %C, i32 noundef %n) {
5+
; CHECK-LABEL: fma_dup_f16:
6+
; CHECK: // %bb.0: // %entry
7+
; CHECK-NEXT: // kill: def $h0 killed $h0 def $q0
8+
; CHECK-NEXT: cbz w2, .LBB0_8
9+
; CHECK-NEXT: // %bb.1: // %for.body.preheader
10+
; CHECK-NEXT: mov w8, w2
11+
; CHECK-NEXT: cmp w2, #15
12+
; CHECK-NEXT: b.hi .LBB0_3
13+
; CHECK-NEXT: // %bb.2:
14+
; CHECK-NEXT: mov x9, xzr
15+
; CHECK-NEXT: b .LBB0_6
16+
; CHECK-NEXT: .LBB0_3: // %vector.ph
17+
; CHECK-NEXT: and x9, x8, #0xfffffff0
18+
; CHECK-NEXT: add x10, x1, #16
19+
; CHECK-NEXT: add x11, x0, #16
20+
; CHECK-NEXT: mov x12, x9
21+
; CHECK-NEXT: dup v1.8h, v0.h[0]
22+
; CHECK-NEXT: .LBB0_4: // %vector.body
23+
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
24+
; CHECK-NEXT: ldp q2, q3, [x11, #-16]
25+
; CHECK-NEXT: subs x12, x12, #16
26+
; CHECK-NEXT: add x11, x11, #32
27+
; CHECK-NEXT: ldp q4, q5, [x10, #-16]
28+
; CHECK-NEXT: fmla v4.8h, v2.8h, v1.8h
29+
; CHECK-NEXT: fmla v5.8h, v3.8h, v0.h[0]
30+
; CHECK-NEXT: stp q4, q5, [x10, #-16]
31+
; CHECK-NEXT: add x10, x10, #32
32+
; CHECK-NEXT: b.ne .LBB0_4
33+
; CHECK-NEXT: // %bb.5: // %middle.block
34+
; CHECK-NEXT: cmp x9, x8
35+
; CHECK-NEXT: b.eq .LBB0_8
36+
; CHECK-NEXT: .LBB0_6: // %for.body.preheader1
37+
; CHECK-NEXT: lsl x10, x9, #1
38+
; CHECK-NEXT: sub x8, x8, x9
39+
; CHECK-NEXT: add x9, x1, x10
40+
; CHECK-NEXT: add x10, x0, x10
41+
; CHECK-NEXT: .LBB0_7: // %for.body
42+
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
43+
; CHECK-NEXT: ldr h1, [x10], #2
44+
; CHECK-NEXT: ldr h2, [x9]
45+
; CHECK-NEXT: subs x8, x8, #1
46+
; CHECK-NEXT: fmadd h1, h1, h0, h2
47+
; CHECK-NEXT: str h1, [x9], #2
48+
; CHECK-NEXT: b.ne .LBB0_7
49+
; CHECK-NEXT: .LBB0_8: // %for.cond.cleanup
50+
; CHECK-NEXT: ret
51+
entry:
52+
%cmp6.not = icmp eq i32 %n, 0
53+
br i1 %cmp6.not, label %for.cond.cleanup, label %for.body.preheader
54+
55+
for.body.preheader: ; preds = %entry
56+
%wide.trip.count = zext i32 %n to i64
57+
%min.iters.check = icmp ult i32 %n, 16
58+
br i1 %min.iters.check, label %for.body.preheader14, label %vector.ph
59+
60+
vector.ph: ; preds = %for.body.preheader
61+
%n.vec = and i64 %wide.trip.count, 4294967280
62+
%broadcast.splatinsert = insertelement <8 x half> poison, half %B, i64 0
63+
%broadcast.splat = shufflevector <8 x half> %broadcast.splatinsert, <8 x half> poison, <8 x i32> zeroinitializer
64+
%broadcast.splatinsert10 = insertelement <8 x half> poison, half %B, i64 0
65+
%broadcast.splat11 = shufflevector <8 x half> %broadcast.splatinsert10, <8 x half> poison, <8 x i32> zeroinitializer
66+
br label %vector.body
67+
68+
vector.body: ; preds = %vector.body, %vector.ph
69+
%index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
70+
%0 = getelementptr inbounds half, ptr %A, i64 %index
71+
%wide.load = load <8 x half>, ptr %0, align 2
72+
%1 = getelementptr inbounds half, ptr %0, i64 8
73+
%wide.load9 = load <8 x half>, ptr %1, align 2
74+
%2 = fmul fast <8 x half> %wide.load, %broadcast.splat
75+
%3 = fmul fast <8 x half> %wide.load9, %broadcast.splat11
76+
%4 = getelementptr inbounds half, ptr %C, i64 %index
77+
%wide.load12 = load <8 x half>, ptr %4, align 2
78+
%5 = getelementptr inbounds half, ptr %4, i64 8
79+
%wide.load13 = load <8 x half>, ptr %5, align 2
80+
%6 = fadd fast <8 x half> %wide.load12, %2
81+
%7 = fadd fast <8 x half> %wide.load13, %3
82+
store <8 x half> %6, ptr %4, align 2
83+
store <8 x half> %7, ptr %5, align 2
84+
%index.next = add nuw i64 %index, 16
85+
%8 = icmp eq i64 %index.next, %n.vec
86+
br i1 %8, label %middle.block, label %vector.body
87+
88+
middle.block: ; preds = %vector.body
89+
%cmp.n = icmp eq i64 %n.vec, %wide.trip.count
90+
br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader14
91+
92+
for.body.preheader14: ; preds = %for.body.preheader, %middle.block
93+
%indvars.iv.ph = phi i64 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]
94+
br label %for.body
95+
96+
for.cond.cleanup: ; preds = %for.body, %middle.block, %entry
97+
ret void
98+
99+
for.body: ; preds = %for.body.preheader14, %for.body
100+
%indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader14 ]
101+
%arrayidx = getelementptr inbounds half, ptr %A, i64 %indvars.iv
102+
%9 = load half, ptr %arrayidx, align 2
103+
%mul = fmul fast half %9, %B
104+
%arrayidx2 = getelementptr inbounds half, ptr %C, i64 %indvars.iv
105+
%10 = load half, ptr %arrayidx2, align 2
106+
%add = fadd fast half %10, %mul
107+
store half %add, ptr %arrayidx2, align 2
108+
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
109+
%exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
110+
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
111+
}

llvm/test/CodeGen/AArch64/machine-combiner-fmul-dup.mir

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@
9595
br label %for.cond
9696
}
9797

98+
define void @extracopy(<2 x float> %shuf, <2 x float> %mu, <2 x float> %ad, <2 x float>* %ret) #0 {
99+
unreachable
100+
}
101+
98102
attributes #0 = { "target-cpu"="cortex-a57" }
99103

100104
...
@@ -545,3 +549,71 @@ body: |
545549
B %bb.1
546550
547551
...
552+
---
553+
name: extracopy
554+
alignment: 16
555+
tracksRegLiveness: true
556+
registers:
557+
- { id: 0, class: fpr64 }
558+
- { id: 1, class: fpr64 }
559+
- { id: 2, class: fpr64 }
560+
- { id: 3, class: fpr64 }
561+
- { id: 4, class: gpr64common }
562+
- { id: 5, class: fpr64 }
563+
- { id: 6, class: fpr64 }
564+
- { id: 7, class: fpr128 }
565+
- { id: 8, class: fpr128 }
566+
- { id: 9, class: fpr64 }
567+
- { id: 10, class: fpr64 }
568+
- { id: 11, class: fpr64 }
569+
liveins:
570+
- { reg: '$d0', virtual-reg: '%1' }
571+
- { reg: '$d1', virtual-reg: '%2' }
572+
- { reg: '$d2', virtual-reg: '%3' }
573+
- { reg: '$x0', virtual-reg: '%4' }
574+
frameInfo:
575+
maxAlignment: 1
576+
maxCallFrameSize: 0
577+
machineFunctionInfo: {}
578+
body: |
579+
; CHECK-LABEL: name: extracopy
580+
; CHECK: bb.0:
581+
; CHECK-NEXT: liveins: $d0, $d1, $d2, $x0
582+
; CHECK-NEXT: {{ $}}
583+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64common = COPY $x0
584+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $d2
585+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr64 = COPY $d1
586+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr64 = COPY $d0
587+
; CHECK-NEXT: [[DEF:%[0-9]+]]:fpr128 = IMPLICIT_DEF
588+
; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:fpr128 = INSERT_SUBREG [[DEF]], [[COPY3]], %subreg.dsub
589+
; CHECK-NEXT: [[COPY4:%[0-9]+]]:fpr64 = COPY [[COPY1]]
590+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:fpr64 = COPY [[COPY2]]
591+
; CHECK-NEXT: [[DUPv2i32lane:%[0-9]+]]:fpr64 = DUPv2i32lane killed [[INSERT_SUBREG]], 0
592+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:fpr64 = COPY [[DUPv2i32lane]]
593+
; CHECK-NEXT: {{ $}}
594+
; CHECK-NEXT: bb.1:
595+
; CHECK-NEXT: [[FMULv2f32_:%[0-9]+]]:fpr64 = FMULv2f32 [[COPY5]], [[COPY6]]
596+
; CHECK-NEXT: [[FADDv2f32_:%[0-9]+]]:fpr64 = FADDv2f32 killed [[FMULv2f32_]], [[COPY4]]
597+
; CHECK-NEXT: STRDui killed [[FADDv2f32_]], [[COPY]], 0 :: (store (s64), align 16)
598+
; CHECK-NEXT: B %bb.1
599+
bb.0:
600+
liveins: $d0, $d1, $d2, $x0
601+
602+
%4:gpr64common = COPY $x0
603+
%3:fpr64 = COPY $d2
604+
%2:fpr64 = COPY $d1
605+
%1:fpr64 = COPY $d0
606+
%8:fpr128 = IMPLICIT_DEF
607+
%7:fpr128 = INSERT_SUBREG %8, %1, %subreg.dsub
608+
%6:fpr64 = COPY %3
609+
%5:fpr64 = COPY %2
610+
%11:fpr64 = DUPv2i32lane killed %7, 0
611+
%0:fpr64 = COPY %11
612+
613+
bb.1:
614+
%9:fpr64 = FMULv2f32 %5, %0
615+
%10:fpr64 = FADDv2f32 killed %9, %6
616+
STRDui killed %10, %4, 0 :: (store 8, align 16)
617+
B %bb.1
618+
619+
...

0 commit comments

Comments
 (0)