xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-ccmp-heuristics.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=cyclone -verify-machineinstrs -aarch64-ccmp | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget triple = "arm64-apple-ios7.0.0"
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker@channelColumns = external global i64
5*9880d681SAndroid Build Coastguard Worker@channelTracks = external global i64
6*9880d681SAndroid Build Coastguard Worker@mazeRoute = external hidden unnamed_addr global i8*, align 8
7*9880d681SAndroid Build Coastguard Worker@TOP = external global i64*
8*9880d681SAndroid Build Coastguard Worker@BOT = external global i64*
9*9880d681SAndroid Build Coastguard Worker@netsAssign = external global i64*
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker; Function from yacr2/maze.c
12*9880d681SAndroid Build Coastguard Worker; The branch at the end of %if.then is driven by %cmp5 and %cmp6.
13*9880d681SAndroid Build Coastguard Worker; Isel converts the and i1 into two branches, and arm64-ccmp should not convert
14*9880d681SAndroid Build Coastguard Worker; it back again. %cmp6 has much higher latency than %cmp5.
15*9880d681SAndroid Build Coastguard Worker; CHECK: Maze1
16*9880d681SAndroid Build Coastguard Worker; CHECK: %if.then
17*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x{{[0-9]+}}, #2
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.lo
19*9880d681SAndroid Build Coastguard Worker; CHECK: %if.then
20*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x{{[0-9]+}}, #2
21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.lo
22*9880d681SAndroid Build Coastguard Workerdefine i32 @Maze1() nounwind ssp {
23*9880d681SAndroid Build Coastguard Workerentry:
24*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* @channelColumns, align 8, !tbaa !0
25*9880d681SAndroid Build Coastguard Worker  %cmp90 = icmp eq i64 %0, 0
26*9880d681SAndroid Build Coastguard Worker  br i1 %cmp90, label %for.end, label %for.body
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.inc, %entry
29*9880d681SAndroid Build Coastguard Worker  %1 = phi i64 [ %0, %entry ], [ %37, %for.inc ]
30*9880d681SAndroid Build Coastguard Worker  %i.092 = phi i64 [ 1, %entry ], [ %inc53, %for.inc ]
31*9880d681SAndroid Build Coastguard Worker  %numLeft.091 = phi i32 [ 0, %entry ], [ %numLeft.1, %for.inc ]
32*9880d681SAndroid Build Coastguard Worker  %2 = load i8*, i8** @mazeRoute, align 8, !tbaa !3
33*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %2, i64 %i.092
34*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %arrayidx, align 1, !tbaa !1
35*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %3, 0
36*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %for.inc, label %if.then
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %for.body
39*9880d681SAndroid Build Coastguard Worker  %4 = load i64*, i64** @TOP, align 8, !tbaa !3
40*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i64, i64* %4, i64 %i.092
41*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %arrayidx1, align 8, !tbaa !0
42*9880d681SAndroid Build Coastguard Worker  %6 = load i64*, i64** @netsAssign, align 8, !tbaa !3
43*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i64, i64* %6, i64 %5
44*9880d681SAndroid Build Coastguard Worker  %7 = load i64, i64* %arrayidx2, align 8, !tbaa !0
45*9880d681SAndroid Build Coastguard Worker  %8 = load i64*, i64** @BOT, align 8, !tbaa !3
46*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds i64, i64* %8, i64 %i.092
47*9880d681SAndroid Build Coastguard Worker  %9 = load i64, i64* %arrayidx3, align 8, !tbaa !0
48*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds i64, i64* %6, i64 %9
49*9880d681SAndroid Build Coastguard Worker  %10 = load i64, i64* %arrayidx4, align 8, !tbaa !0
50*9880d681SAndroid Build Coastguard Worker  %cmp5 = icmp ugt i64 %i.092, 1
51*9880d681SAndroid Build Coastguard Worker  %cmp6 = icmp ugt i64 %10, 1
52*9880d681SAndroid Build Coastguard Worker  %or.cond = and i1 %cmp5, %cmp6
53*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond, label %land.lhs.true7, label %if.else
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerland.lhs.true7:                                   ; preds = %if.then
56*9880d681SAndroid Build Coastguard Worker  %11 = load i64, i64* @channelTracks, align 8, !tbaa !0
57*9880d681SAndroid Build Coastguard Worker  %add = add i64 %11, 1
58*9880d681SAndroid Build Coastguard Worker  %call = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 %add, i64 %10, i64 0, i64 %7, i32 -1, i32 -1)
59*9880d681SAndroid Build Coastguard Worker  %tobool8 = icmp eq i32 %call, 0
60*9880d681SAndroid Build Coastguard Worker  br i1 %tobool8, label %land.lhs.true7.if.else_crit_edge, label %if.then9
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerland.lhs.true7.if.else_crit_edge:                 ; preds = %land.lhs.true7
63*9880d681SAndroid Build Coastguard Worker  %.pre = load i64, i64* @channelColumns, align 8, !tbaa !0
64*9880d681SAndroid Build Coastguard Worker  br label %if.else
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerif.then9:                                         ; preds = %land.lhs.true7
67*9880d681SAndroid Build Coastguard Worker  %12 = load i8*, i8** @mazeRoute, align 8, !tbaa !3
68*9880d681SAndroid Build Coastguard Worker  %arrayidx10 = getelementptr inbounds i8, i8* %12, i64 %i.092
69*9880d681SAndroid Build Coastguard Worker  store i8 0, i8* %arrayidx10, align 1, !tbaa !1
70*9880d681SAndroid Build Coastguard Worker  %13 = load i64*, i64** @TOP, align 8, !tbaa !3
71*9880d681SAndroid Build Coastguard Worker  %arrayidx11 = getelementptr inbounds i64, i64* %13, i64 %i.092
72*9880d681SAndroid Build Coastguard Worker  %14 = load i64, i64* %arrayidx11, align 8, !tbaa !0
73*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @CleanNet(i64 %14)
74*9880d681SAndroid Build Coastguard Worker  %15 = load i64*, i64** @BOT, align 8, !tbaa !3
75*9880d681SAndroid Build Coastguard Worker  %arrayidx12 = getelementptr inbounds i64, i64* %15, i64 %i.092
76*9880d681SAndroid Build Coastguard Worker  %16 = load i64, i64* %arrayidx12, align 8, !tbaa !0
77*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @CleanNet(i64 %16)
78*9880d681SAndroid Build Coastguard Worker  br label %for.inc
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerif.else:                                          ; preds = %land.lhs.true7.if.else_crit_edge, %if.then
81*9880d681SAndroid Build Coastguard Worker  %17 = phi i64 [ %.pre, %land.lhs.true7.if.else_crit_edge ], [ %1, %if.then ]
82*9880d681SAndroid Build Coastguard Worker  %cmp13 = icmp ult i64 %i.092, %17
83*9880d681SAndroid Build Coastguard Worker  %or.cond89 = and i1 %cmp13, %cmp6
84*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond89, label %land.lhs.true16, label %if.else24
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerland.lhs.true16:                                  ; preds = %if.else
87*9880d681SAndroid Build Coastguard Worker  %18 = load i64, i64* @channelTracks, align 8, !tbaa !0
88*9880d681SAndroid Build Coastguard Worker  %add17 = add i64 %18, 1
89*9880d681SAndroid Build Coastguard Worker  %call18 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 %add17, i64 %10, i64 0, i64 %7, i32 1, i32 -1)
90*9880d681SAndroid Build Coastguard Worker  %tobool19 = icmp eq i32 %call18, 0
91*9880d681SAndroid Build Coastguard Worker  br i1 %tobool19, label %if.else24, label %if.then20
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerif.then20:                                        ; preds = %land.lhs.true16
94*9880d681SAndroid Build Coastguard Worker  %19 = load i8*, i8** @mazeRoute, align 8, !tbaa !3
95*9880d681SAndroid Build Coastguard Worker  %arrayidx21 = getelementptr inbounds i8, i8* %19, i64 %i.092
96*9880d681SAndroid Build Coastguard Worker  store i8 0, i8* %arrayidx21, align 1, !tbaa !1
97*9880d681SAndroid Build Coastguard Worker  %20 = load i64*, i64** @TOP, align 8, !tbaa !3
98*9880d681SAndroid Build Coastguard Worker  %arrayidx22 = getelementptr inbounds i64, i64* %20, i64 %i.092
99*9880d681SAndroid Build Coastguard Worker  %21 = load i64, i64* %arrayidx22, align 8, !tbaa !0
100*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @CleanNet(i64 %21)
101*9880d681SAndroid Build Coastguard Worker  %22 = load i64*, i64** @BOT, align 8, !tbaa !3
102*9880d681SAndroid Build Coastguard Worker  %arrayidx23 = getelementptr inbounds i64, i64* %22, i64 %i.092
103*9880d681SAndroid Build Coastguard Worker  %23 = load i64, i64* %arrayidx23, align 8, !tbaa !0
104*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @CleanNet(i64 %23)
105*9880d681SAndroid Build Coastguard Worker  br label %for.inc
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerif.else24:                                        ; preds = %land.lhs.true16, %if.else
108*9880d681SAndroid Build Coastguard Worker  br i1 %cmp5, label %land.lhs.true26, label %if.else36
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerland.lhs.true26:                                  ; preds = %if.else24
111*9880d681SAndroid Build Coastguard Worker  %24 = load i64, i64* @channelTracks, align 8, !tbaa !0
112*9880d681SAndroid Build Coastguard Worker  %cmp27 = icmp ult i64 %7, %24
113*9880d681SAndroid Build Coastguard Worker  br i1 %cmp27, label %land.lhs.true28, label %if.else36
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerland.lhs.true28:                                  ; preds = %land.lhs.true26
116*9880d681SAndroid Build Coastguard Worker  %add29 = add i64 %24, 1
117*9880d681SAndroid Build Coastguard Worker  %call30 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 0, i64 %7, i64 %add29, i64 %10, i32 -1, i32 1)
118*9880d681SAndroid Build Coastguard Worker  %tobool31 = icmp eq i32 %call30, 0
119*9880d681SAndroid Build Coastguard Worker  br i1 %tobool31, label %if.else36, label %if.then32
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerif.then32:                                        ; preds = %land.lhs.true28
122*9880d681SAndroid Build Coastguard Worker  %25 = load i8*, i8** @mazeRoute, align 8, !tbaa !3
123*9880d681SAndroid Build Coastguard Worker  %arrayidx33 = getelementptr inbounds i8, i8* %25, i64 %i.092
124*9880d681SAndroid Build Coastguard Worker  store i8 0, i8* %arrayidx33, align 1, !tbaa !1
125*9880d681SAndroid Build Coastguard Worker  %26 = load i64*, i64** @TOP, align 8, !tbaa !3
126*9880d681SAndroid Build Coastguard Worker  %arrayidx34 = getelementptr inbounds i64, i64* %26, i64 %i.092
127*9880d681SAndroid Build Coastguard Worker  %27 = load i64, i64* %arrayidx34, align 8, !tbaa !0
128*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @CleanNet(i64 %27)
129*9880d681SAndroid Build Coastguard Worker  %28 = load i64*, i64** @BOT, align 8, !tbaa !3
130*9880d681SAndroid Build Coastguard Worker  %arrayidx35 = getelementptr inbounds i64, i64* %28, i64 %i.092
131*9880d681SAndroid Build Coastguard Worker  %29 = load i64, i64* %arrayidx35, align 8, !tbaa !0
132*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @CleanNet(i64 %29)
133*9880d681SAndroid Build Coastguard Worker  br label %for.inc
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerif.else36:                                        ; preds = %land.lhs.true28, %land.lhs.true26, %if.else24
136*9880d681SAndroid Build Coastguard Worker  %30 = load i64, i64* @channelColumns, align 8, !tbaa !0
137*9880d681SAndroid Build Coastguard Worker  %cmp37 = icmp ult i64 %i.092, %30
138*9880d681SAndroid Build Coastguard Worker  br i1 %cmp37, label %land.lhs.true38, label %if.else48
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerland.lhs.true38:                                  ; preds = %if.else36
141*9880d681SAndroid Build Coastguard Worker  %31 = load i64, i64* @channelTracks, align 8, !tbaa !0
142*9880d681SAndroid Build Coastguard Worker  %cmp39 = icmp ult i64 %7, %31
143*9880d681SAndroid Build Coastguard Worker  br i1 %cmp39, label %land.lhs.true40, label %if.else48
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerland.lhs.true40:                                  ; preds = %land.lhs.true38
146*9880d681SAndroid Build Coastguard Worker  %add41 = add i64 %31, 1
147*9880d681SAndroid Build Coastguard Worker  %call42 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 0, i64 %7, i64 %add41, i64 %10, i32 1, i32 1)
148*9880d681SAndroid Build Coastguard Worker  %tobool43 = icmp eq i32 %call42, 0
149*9880d681SAndroid Build Coastguard Worker  br i1 %tobool43, label %if.else48, label %if.then44
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerif.then44:                                        ; preds = %land.lhs.true40
152*9880d681SAndroid Build Coastguard Worker  %32 = load i8*, i8** @mazeRoute, align 8, !tbaa !3
153*9880d681SAndroid Build Coastguard Worker  %arrayidx45 = getelementptr inbounds i8, i8* %32, i64 %i.092
154*9880d681SAndroid Build Coastguard Worker  store i8 0, i8* %arrayidx45, align 1, !tbaa !1
155*9880d681SAndroid Build Coastguard Worker  %33 = load i64*, i64** @TOP, align 8, !tbaa !3
156*9880d681SAndroid Build Coastguard Worker  %arrayidx46 = getelementptr inbounds i64, i64* %33, i64 %i.092
157*9880d681SAndroid Build Coastguard Worker  %34 = load i64, i64* %arrayidx46, align 8, !tbaa !0
158*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @CleanNet(i64 %34)
159*9880d681SAndroid Build Coastguard Worker  %35 = load i64*, i64** @BOT, align 8, !tbaa !3
160*9880d681SAndroid Build Coastguard Worker  %arrayidx47 = getelementptr inbounds i64, i64* %35, i64 %i.092
161*9880d681SAndroid Build Coastguard Worker  %36 = load i64, i64* %arrayidx47, align 8, !tbaa !0
162*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @CleanNet(i64 %36)
163*9880d681SAndroid Build Coastguard Worker  br label %for.inc
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerif.else48:                                        ; preds = %land.lhs.true40, %land.lhs.true38, %if.else36
166*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %numLeft.091, 1
167*9880d681SAndroid Build Coastguard Worker  br label %for.inc
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %if.else48, %if.then44, %if.then32, %if.then20, %if.then9, %for.body
170*9880d681SAndroid Build Coastguard Worker  %numLeft.1 = phi i32 [ %numLeft.091, %if.then9 ], [ %numLeft.091, %if.then20 ], [ %numLeft.091, %if.then32 ], [ %numLeft.091, %if.then44 ], [ %inc, %if.else48 ], [ %numLeft.091, %for.body ]
171*9880d681SAndroid Build Coastguard Worker  %inc53 = add i64 %i.092, 1
172*9880d681SAndroid Build Coastguard Worker  %37 = load i64, i64* @channelColumns, align 8, !tbaa !0
173*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i64 %inc53, %37
174*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.end, label %for.body
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.inc, %entry
177*9880d681SAndroid Build Coastguard Worker  %numLeft.0.lcssa = phi i32 [ 0, %entry ], [ %numLeft.1, %for.inc ]
178*9880d681SAndroid Build Coastguard Worker  ret i32 %numLeft.0.lcssa
179*9880d681SAndroid Build Coastguard Worker}
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker; Materializable
182*9880d681SAndroid Build Coastguard Workerdeclare hidden fastcc i32 @Maze1Mech(i64, i64, i64, i64, i64, i32, i32) nounwind ssp
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker; Materializable
185*9880d681SAndroid Build Coastguard Workerdeclare hidden fastcc void @CleanNet(i64) nounwind ssp
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker!0 = !{!"long", !1}
188*9880d681SAndroid Build Coastguard Worker!1 = !{!"omnipotent char", !2}
189*9880d681SAndroid Build Coastguard Worker!2 = !{!"Simple C/C++ TBAA"}
190*9880d681SAndroid Build Coastguard Worker!3 = !{!"any pointer", !1}
191