xref: /aosp_15_r20/external/llvm/test/CodeGen/Mips/delay-slot-fill-forward.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips32r2 -O2 \
2*9880d681SAndroid Build Coastguard Worker; RUN:     -disable-mips-df-forward-search=false \
3*9880d681SAndroid Build Coastguard Worker; RUN:     -disable-mips-df-succbb-search=false \
4*9880d681SAndroid Build Coastguard Worker; RUN:     -relocation-model=static | FileCheck %s
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; This test was generated with bugpoint from
7*9880d681SAndroid Build Coastguard Worker; MultiSource/Applications/JM/lencod/me_fullsearch.c
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker%struct.SubImageContainer = type { i16****, [2 x i16****] }
10*9880d681SAndroid Build Coastguard Worker%struct.storable_picture = type { i32, i32, i32, i32, i32, i32,
11*9880d681SAndroid Build Coastguard Worker  [6 x [33 x i64]], [6 x [33 x i64]], [6 x [33 x i64]], [6 x [33 x i64]],
12*9880d681SAndroid Build Coastguard Worker  i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32,
13*9880d681SAndroid Build Coastguard Worker  i32, i32, i32, i32, i32, i16**, i16****, i16****, i16*****, i16***,
14*9880d681SAndroid Build Coastguard Worker  i8*, i8***, i64***, i64***, i16****, i8**, i8**, %struct.storable_picture*,
15*9880d681SAndroid Build Coastguard Worker  %struct.storable_picture*, %struct.storable_picture*,
16*9880d681SAndroid Build Coastguard Worker  i32, i32, i32, i32, i32, i32, i32 }
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker@img_height = external global i16, align 2
19*9880d681SAndroid Build Coastguard Worker@width_pad = external global i32, align 4
20*9880d681SAndroid Build Coastguard Worker@height_pad = external global i32, align 4
21*9880d681SAndroid Build Coastguard Worker@mvbits = external global i32*, align 4
22*9880d681SAndroid Build Coastguard Worker@ref_pic1_sub = external global %struct.SubImageContainer, align 4
23*9880d681SAndroid Build Coastguard Worker@ref_pic2_sub = external global %struct.SubImageContainer, align 4
24*9880d681SAndroid Build Coastguard Worker@wbp_weight = external global i32****, align 4
25*9880d681SAndroid Build Coastguard Worker@weight1 = external global i16, align 2
26*9880d681SAndroid Build Coastguard Worker@weight2 = external global i16, align 2
27*9880d681SAndroid Build Coastguard Worker@offsetBi = external global i16, align 2
28*9880d681SAndroid Build Coastguard Worker@computeBiPred2 = external global [3 x i32 (i16*, i32, i32, i32, i32, i32, i32, i32)*], align 4
29*9880d681SAndroid Build Coastguard Worker@computeBiPred = external global i32 (i16*, i32, i32, i32, i32, i32, i32, i32)*, align 4
30*9880d681SAndroid Build Coastguard Worker@bipred2_access_method = external global i32, align 4
31*9880d681SAndroid Build Coastguard Worker@start_me_refinement_hp = external global i32, align 4
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdeclare i32 @foobar(i16*, i32 signext , i32 signext , i32 signext ,
34*9880d681SAndroid Build Coastguard Worker                    i32 signext , i32 signext , i32 signext , i32 signext ) #1
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdefine void @SubPelBlockSearchBiPred(i16* %orig_pic, i16 signext %ref,
37*9880d681SAndroid Build Coastguard Worker    i32 signext %pic_pix_x, i32 signext %pic_pix_y, i16 signext %pred_mv_y,
38*9880d681SAndroid Build Coastguard Worker    i16* nocapture %mv_x, i16* nocapture %mv_y, i16* nocapture readonly %s_mv_x,
39*9880d681SAndroid Build Coastguard Worker    i32 signext %search_pos2, i32 signext %min_mcost) #0 {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: SubPelBlockSearchBiPred:
41*9880d681SAndroid Build Coastguard Workerentry:
42*9880d681SAndroid Build Coastguard Worker  %add40 = shl i32 %pic_pix_x, 2
43*9880d681SAndroid Build Coastguard Worker  %shl = add i32 %add40, 80
44*9880d681SAndroid Build Coastguard Worker  %add41 = shl i32 %pic_pix_y, 2
45*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @start_me_refinement_hp, align 4, !tbaa !1
46*9880d681SAndroid Build Coastguard Worker  %cond47 = select i1 undef, i32 1, i32 %search_pos2
47*9880d681SAndroid Build Coastguard Worker  %1 = load i16, i16* %s_mv_x, align 2, !tbaa !5
48*9880d681SAndroid Build Coastguard Worker  %conv48 = sext i16 %1 to i32
49*9880d681SAndroid Build Coastguard Worker  %add49 = add nsw i32 %conv48, %shl
50*9880d681SAndroid Build Coastguard Worker  %idxprom52 = sext i16 %ref to i32
51*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* null, align 4, !tbaa !1
52*9880d681SAndroid Build Coastguard Worker  store i32 undef, i32* bitcast (%struct.SubImageContainer* @ref_pic1_sub to i32*), align 4, !tbaa !7
53*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* undef, align 4, !tbaa !10
54*9880d681SAndroid Build Coastguard Worker  store i32 %3, i32* bitcast (%struct.SubImageContainer* @ref_pic2_sub to i32*), align 4, !tbaa !7
55*9880d681SAndroid Build Coastguard Worker  store i16 0, i16* @img_height, align 2, !tbaa !5
56*9880d681SAndroid Build Coastguard Worker  %size_x_pad = getelementptr inbounds %struct.storable_picture, %struct.storable_picture* null, i32 0, i32 22
57*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %size_x_pad, align 4, !tbaa !12
58*9880d681SAndroid Build Coastguard Worker  store i32 %4, i32* @width_pad, align 4, !tbaa !1
59*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* undef, align 4, !tbaa !13
60*9880d681SAndroid Build Coastguard Worker  store i32 %5, i32* @height_pad, align 4, !tbaa !1
61*9880d681SAndroid Build Coastguard Worker  %6 = load i32****, i32***** @wbp_weight, align 4, !tbaa !14
62*9880d681SAndroid Build Coastguard Worker  %arrayidx75 = getelementptr inbounds i32***, i32**** %6, i32 undef
63*9880d681SAndroid Build Coastguard Worker  %7 = load i32***, i32**** %arrayidx75, align 4, !tbaa !14
64*9880d681SAndroid Build Coastguard Worker  %arrayidx76 = getelementptr inbounds i32**, i32*** %7, i32 %idxprom52
65*9880d681SAndroid Build Coastguard Worker  %8 = load i32**, i32*** %arrayidx76, align 4, !tbaa !14
66*9880d681SAndroid Build Coastguard Worker  %cond87.in671 = load i32*, i32** %8, align 4
67*9880d681SAndroid Build Coastguard Worker  %cond87672 = load i32, i32* %cond87.in671, align 4
68*9880d681SAndroid Build Coastguard Worker  %conv88673 = trunc i32 %cond87672 to i16
69*9880d681SAndroid Build Coastguard Worker  store i16 %conv88673, i16* @weight1, align 2, !tbaa !5
70*9880d681SAndroid Build Coastguard Worker  %cond105 = load i32, i32* undef, align 4
71*9880d681SAndroid Build Coastguard Worker  %conv106 = trunc i32 %cond105 to i16
72*9880d681SAndroid Build Coastguard Worker  store i16 %conv106, i16* @weight2, align 2, !tbaa !5
73*9880d681SAndroid Build Coastguard Worker  store i16 0, i16* @offsetBi, align 2, !tbaa !5
74*9880d681SAndroid Build Coastguard Worker  %storemerge655 = load i32, i32* bitcast (i32 (i16*, i32, i32, i32, i32, i32, i32, i32)** getelementptr inbounds ([3 x i32 (i16*, i32, i32, i32, i32, i32, i32, i32)*], [3 x i32 (i16*, i32, i32, i32, i32, i32, i32, i32)*]* @computeBiPred2, i32 0, i32 1) to i32*), align 4
75*9880d681SAndroid Build Coastguard Worker  store i32 %storemerge655, i32* bitcast (i32 (i16*, i32, i32, i32, i32, i32, i32, i32)** @computeBiPred to i32*), align 4, !tbaa !14
76*9880d681SAndroid Build Coastguard Worker  %9 = load i16, i16* %mv_x, align 2, !tbaa !5
77*9880d681SAndroid Build Coastguard Worker  %cmp270 = icmp sgt i32 undef, 1
78*9880d681SAndroid Build Coastguard Worker  %or.cond = and i1 %cmp270, false
79*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond, label %land.lhs.true277, label %if.else289
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerland.lhs.true277:                                 ; preds = %entry
82*9880d681SAndroid Build Coastguard Worker  %10 = load i16, i16* %mv_y, align 2, !tbaa !5
83*9880d681SAndroid Build Coastguard Worker  %conv278 = sext i16 %10 to i32
84*9880d681SAndroid Build Coastguard Worker  %add279 = add nsw i32 %conv278, 0
85*9880d681SAndroid Build Coastguard Worker  %cmp280 = icmp sgt i32 %add279, 1
86*9880d681SAndroid Build Coastguard Worker  %or.cond660 = and i1 %cmp280, undef
87*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond660, label %if.end290, label %if.else289
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerif.else289:                                       ; preds = %land.lhs.true277, %entry
90*9880d681SAndroid Build Coastguard Worker  br label %if.end290
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerif.end290:                                        ; preds = %if.else289, %land.lhs.true277
93*9880d681SAndroid Build Coastguard Worker  %storemerge = phi i32 [ 1, %if.else289 ], [ 0, %land.lhs.true277 ]
94*9880d681SAndroid Build Coastguard Worker  store i32 %storemerge, i32* @bipred2_access_method, align 4, !tbaa !1
95*9880d681SAndroid Build Coastguard Worker  %cmp315698 = icmp slt i32 %0, %cond47
96*9880d681SAndroid Build Coastguard Worker  br i1 %cmp315698, label %for.body.lr.ph, label %if.end358
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerfor.body.lr.ph:                                   ; preds = %if.end290
99*9880d681SAndroid Build Coastguard Worker  %conv328 = sext i16 %pred_mv_y to i32
100*9880d681SAndroid Build Coastguard Worker  br label %for.body
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.inc, %for.body.lr.ph
103*9880d681SAndroid Build Coastguard Worker  %11 = phi i16 [ %9, %for.body.lr.ph ], [ %.pre, %for.inc ]
104*9880d681SAndroid Build Coastguard Worker  %min_mcost.addr.0701 = phi i32 [ %min_mcost, %for.body.lr.ph ], [ undef, %for.inc ]
105*9880d681SAndroid Build Coastguard Worker  %pos.0700 = phi i32 [ %0, %for.body.lr.ph ], [ undef, %for.inc ]
106*9880d681SAndroid Build Coastguard Worker  %best_pos.0699 = phi i32 [ 0, %for.body.lr.ph ], [ %best_pos.1, %for.inc ]
107*9880d681SAndroid Build Coastguard Worker  %conv317 = sext i16 %11 to i32
108*9880d681SAndroid Build Coastguard Worker  %add320 = add nsw i32 0, %conv317
109*9880d681SAndroid Build Coastguard Worker  %12 = load i16, i16* %mv_y, align 2, !tbaa !5
110*9880d681SAndroid Build Coastguard Worker  %conv321 = sext i16 %12 to i32
111*9880d681SAndroid Build Coastguard Worker  %add324 = add nsw i32 0, %conv321
112*9880d681SAndroid Build Coastguard Worker  %13 = load i32*, i32** @mvbits, align 4, !tbaa !14
113*9880d681SAndroid Build Coastguard Worker  %14 = load i32, i32* undef, align 4, !tbaa !1
114*9880d681SAndroid Build Coastguard Worker  %sub329 = sub nsw i32 %add324, %conv328
115*9880d681SAndroid Build Coastguard Worker  %arrayidx330 = getelementptr inbounds i32, i32* %13, i32 %sub329
116*9880d681SAndroid Build Coastguard Worker  %15 = load i32, i32* %arrayidx330, align 4, !tbaa !1
117*9880d681SAndroid Build Coastguard Worker  %add331 = add nsw i32 %15, %14
118*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %add331, %2
119*9880d681SAndroid Build Coastguard Worker  %shr332 = ashr i32 %mul, 16
120*9880d681SAndroid Build Coastguard Worker  %cmp333 = icmp sgt i32 %min_mcost.addr.0701, %shr332
121*9880d681SAndroid Build Coastguard Worker  br i1 %cmp333, label %if.end336, label %for.inc
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerif.end336:                                        ; preds = %for.body
124*9880d681SAndroid Build Coastguard Worker  ; CHECK:      jalr  $25
125*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT:  move  $ra, {{.*}}
126*9880d681SAndroid Build Coastguard Worker  ; CHECK:      j     $BB{{.*}}
127*9880d681SAndroid Build Coastguard Worker  %add337 = add nsw i32 %add320, %shl
128*9880d681SAndroid Build Coastguard Worker  %add338 = add nsw i32 %add324, 0
129*9880d681SAndroid Build Coastguard Worker  %call340 = tail call i32 undef(i16* %orig_pic, i32 signext undef, i32 signext
130*9880d681SAndroid Build Coastguard Worker                                 undef, i32 signext 0, i32 signext %add49,
131*9880d681SAndroid Build Coastguard Worker                                 i32 signext undef, i32 signext %add337,
132*9880d681SAndroid Build Coastguard Worker                                 i32 signext %add338) #1
133*9880d681SAndroid Build Coastguard Worker  %cmp342 = icmp slt i32 0, %min_mcost.addr.0701
134*9880d681SAndroid Build Coastguard Worker  %pos.0.best_pos.0 = select i1 %cmp342, i32 %pos.0700, i32 %best_pos.0699
135*9880d681SAndroid Build Coastguard Worker  br label %for.inc
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %if.end336, %for.body
138*9880d681SAndroid Build Coastguard Worker  %best_pos.1 = phi i32 [ %best_pos.0699, %for.body ], [ %pos.0.best_pos.0, %if.end336 ]
139*9880d681SAndroid Build Coastguard Worker  %.pre = load i16, i16* %mv_x, align 2, !tbaa !5
140*9880d681SAndroid Build Coastguard Worker  br label %for.body
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Workerif.end358:                                        ; preds = %if.end290
143*9880d681SAndroid Build Coastguard Worker  %.min_mcost.addr.0 = select i1 false, i32 2147483647, i32 %min_mcost
144*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.body415.lr.ph, label %if.end461
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerfor.body415.lr.ph:                                ; preds = %if.end358
147*9880d681SAndroid Build Coastguard Worker  %16 = load i16, i16* %mv_y, align 2, !tbaa !5
148*9880d681SAndroid Build Coastguard Worker  %conv420 = sext i16 %16 to i32
149*9880d681SAndroid Build Coastguard Worker  %add423 = add nsw i32 0, %conv420
150*9880d681SAndroid Build Coastguard Worker  %cmp433 = icmp sgt i32 %.min_mcost.addr.0, 0
151*9880d681SAndroid Build Coastguard Worker  br i1 %cmp433, label %if.end436, label %if.end461
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerif.end436:                                        ; preds = %for.body415.lr.ph
154*9880d681SAndroid Build Coastguard Worker  %add438 = add nsw i32 %add423, 0
155*9880d681SAndroid Build Coastguard Worker  %call440 = tail call i32 @foobar(i16* %orig_pic, i32 signext undef, i32 signext undef,
156*9880d681SAndroid Build Coastguard Worker                                 i32 signext 0, i32 signext %add49, i32 signext undef,
157*9880d681SAndroid Build Coastguard Worker                                 i32 signext undef, i32 signext %add438) #1
158*9880d681SAndroid Build Coastguard Worker  br label %if.end461
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerif.end461:                                        ; preds = %if.end436, %for.body415.lr.ph, %if.end358
161*9880d681SAndroid Build Coastguard Worker  ret void
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="mips32r2" "target-features"="+mips32r2,+nooddspreg,+fpxx" "unsafe-fp-math"="false" "use-soft-float"="false" }
165*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind }
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker!llvm.ident = !{!0}
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker!0 = !{!"clang version 3.7.0 (trunk 236218) (llvm/trunk 236237)"}
170*9880d681SAndroid Build Coastguard Worker!1 = !{!2, !2, i64 0}
171*9880d681SAndroid Build Coastguard Worker!2 = !{!"int", !3, i64 0}
172*9880d681SAndroid Build Coastguard Worker!3 = !{!"omnipotent char", !4, i64 0}
173*9880d681SAndroid Build Coastguard Worker!4 = !{!"Simple C/C++ TBAA"}
174*9880d681SAndroid Build Coastguard Worker!5 = !{!6, !6, i64 0}
175*9880d681SAndroid Build Coastguard Worker!6 = !{!"short", !3, i64 0}
176*9880d681SAndroid Build Coastguard Worker!7 = !{!8, !9, i64 0}
177*9880d681SAndroid Build Coastguard Worker!8 = !{!"", !9, i64 0, !3, i64 4}
178*9880d681SAndroid Build Coastguard Worker!9 = !{!"any pointer", !3, i64 0}
179*9880d681SAndroid Build Coastguard Worker!10 = !{!11, !9, i64 6440}
180*9880d681SAndroid Build Coastguard Worker!11 = !{!"storable_picture", !3, i64 0, !2, i64 4, !2, i64 8, !2, i64 12, !2, i64 16, !2, i64 20, !3, i64 24, !3, i64 1608, !3, i64 3192, !3, i64 4776, !2, i64 6360, !2, i64 6364, !2, i64 6368, !2, i64 6372, !2, i64 6376, !2, i64 6380, !2, i64 6384, !2, i64 6388, !2, i64 6392, !2, i64 6396, !2, i64 6400, !2, i64 6404, !2, i64 6408, !2, i64 6412, !2, i64 6416, !2, i64 6420, !2, i64 6424, !2, i64 6428, !2, i64 6432, !9, i64 6436, !9, i64 6440, !9, i64 6444, !9, i64 6448, !9, i64 6452, !9, i64 6456, !9, i64 6460, !9, i64 6464, !9, i64 6468, !9, i64 6472, !9, i64 6476, !9, i64 6480, !9, i64 6484, !9, i64 6488, !9, i64 6492, !2, i64 6496, !2, i64 6500, !2, i64 6504, !2, i64 6508, !2, i64 6512, !2, i64 6516, !2, i64 6520}
181*9880d681SAndroid Build Coastguard Worker!12 = !{!11, !2, i64 6408}
182*9880d681SAndroid Build Coastguard Worker!13 = !{!11, !2, i64 6412}
183*9880d681SAndroid Build Coastguard Worker!14 = !{!9, !9, i64 0}
184