[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / IndVarSimplify / ARM / indvar-cost.ll
blob14d873d9e3ac209360c62b3a17e49f6d91cc74e7
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -indvars -mtriple=thumbv8m.base -S %s -o - | FileCheck %s --check-prefix=CHECK-T1
3 ; RUN: opt -indvars -mtriple=thumbv8m.main -S %s -o - | FileCheck %s --check-prefix=CHECK-T2
5 define dso_local arm_aapcscc void @arm_conv_fast_q15(i16* %pSrcA, i32 %srcALen, i16* %pSrcB, i32 %srcBLen, i16* %pDst, i16** %store.px, i16** %store.py, i32* %store.res) local_unnamed_addr {
6 ; CHECK-T1-LABEL: @arm_conv_fast_q15(
7 ; CHECK-T1-NEXT:  entry:
8 ; CHECK-T1-NEXT:    [[CMP:%.*]] = icmp ult i32 [[SRCALEN:%.*]], [[SRCBLEN:%.*]]
9 ; CHECK-T1-NEXT:    [[SRCALEN_SRCBLEN:%.*]] = select i1 [[CMP]], i32 [[SRCALEN]], i32 [[SRCBLEN]]
10 ; CHECK-T1-NEXT:    [[PSRCB_PSRCA:%.*]] = select i1 [[CMP]], i16* [[PSRCB:%.*]], i16* [[PSRCA:%.*]]
11 ; CHECK-T1-NEXT:    [[PSRCA_PSRCB:%.*]] = select i1 [[CMP]], i16* [[PSRCA]], i16* [[PSRCB]]
12 ; CHECK-T1-NEXT:    [[SUB:%.*]] = add i32 [[SRCALEN_SRCBLEN]], -1
13 ; CHECK-T1-NEXT:    [[CMP41080:%.*]] = icmp eq i32 [[SUB]], 0
14 ; CHECK-T1-NEXT:    br i1 [[CMP41080]], label [[WHILE_END13:%.*]], label [[WHILE_COND5_PREHEADER_PREHEADER:%.*]]
15 ; CHECK-T1:       while.cond5.preheader.preheader:
16 ; CHECK-T1-NEXT:    br label [[WHILE_COND5_PREHEADER:%.*]]
17 ; CHECK-T1:       while.cond5.preheader:
18 ; CHECK-T1-NEXT:    [[COUNT_01084:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_END:%.*]] ], [ 1, [[WHILE_COND5_PREHEADER_PREHEADER]] ]
19 ; CHECK-T1-NEXT:    [[BLOCKSIZE1_01083:%.*]] = phi i32 [ [[DEC12:%.*]], [[WHILE_END]] ], [ [[SUB]], [[WHILE_COND5_PREHEADER_PREHEADER]] ]
20 ; CHECK-T1-NEXT:    [[PY_01082:%.*]] = phi i16* [ [[ADD_PTR:%.*]], [[WHILE_END]] ], [ [[PSRCA_PSRCB]], [[WHILE_COND5_PREHEADER_PREHEADER]] ]
21 ; CHECK-T1-NEXT:    [[POUT_01081:%.*]] = phi i16* [ [[INCDEC_PTR11:%.*]], [[WHILE_END]] ], [ [[PDST:%.*]], [[WHILE_COND5_PREHEADER_PREHEADER]] ]
22 ; CHECK-T1-NEXT:    br label [[WHILE_BODY7:%.*]]
23 ; CHECK-T1:       while.body7:
24 ; CHECK-T1-NEXT:    [[K_01078:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY7]] ], [ [[COUNT_01084]], [[WHILE_COND5_PREHEADER]] ]
25 ; CHECK-T1-NEXT:    [[SUM_01077:%.*]] = phi i32 [ [[ADD6_I:%.*]], [[WHILE_BODY7]] ], [ 0, [[WHILE_COND5_PREHEADER]] ]
26 ; CHECK-T1-NEXT:    [[PY_11076:%.*]] = phi i16* [ [[INCDEC_PTR8:%.*]], [[WHILE_BODY7]] ], [ [[PY_01082]], [[WHILE_COND5_PREHEADER]] ]
27 ; CHECK-T1-NEXT:    [[PX_11075:%.*]] = phi i16* [ [[INCDEC_PTR:%.*]], [[WHILE_BODY7]] ], [ [[PSRCB_PSRCA]], [[WHILE_COND5_PREHEADER]] ]
28 ; CHECK-T1-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i16, i16* [[PX_11075]], i32 1
29 ; CHECK-T1-NEXT:    [[TMP0:%.*]] = load i16, i16* [[PX_11075]], align 2
30 ; CHECK-T1-NEXT:    [[CONV:%.*]] = sext i16 [[TMP0]] to i32
31 ; CHECK-T1-NEXT:    [[INCDEC_PTR8]] = getelementptr inbounds i16, i16* [[PY_11076]], i32 -1
32 ; CHECK-T1-NEXT:    [[TMP1:%.*]] = load i16, i16* [[PY_11076]], align 2
33 ; CHECK-T1-NEXT:    [[CONV9:%.*]] = sext i16 [[TMP1]] to i32
34 ; CHECK-T1-NEXT:    [[MUL_I:%.*]] = mul nsw i32 [[CONV9]], [[CONV]]
35 ; CHECK-T1-NEXT:    [[SHR3_I:%.*]] = ashr i32 [[CONV]], 16
36 ; CHECK-T1-NEXT:    [[SHR4_I:%.*]] = ashr i32 [[CONV9]], 16
37 ; CHECK-T1-NEXT:    [[MUL5_I:%.*]] = mul nsw i32 [[SHR4_I]], [[SHR3_I]]
38 ; CHECK-T1-NEXT:    [[ADD_I:%.*]] = add i32 [[MUL_I]], [[SUM_01077]]
39 ; CHECK-T1-NEXT:    [[ADD6_I]] = add i32 [[ADD_I]], [[MUL5_I]]
40 ; CHECK-T1-NEXT:    [[DEC]] = add nsw i32 [[K_01078]], -1
41 ; CHECK-T1-NEXT:    [[CMP6:%.*]] = icmp eq i32 [[DEC]], 0
42 ; CHECK-T1-NEXT:    br i1 [[CMP6]], label [[WHILE_END]], label [[WHILE_BODY7]]
43 ; CHECK-T1:       while.end:
44 ; CHECK-T1-NEXT:    [[ADD6_I_LCSSA:%.*]] = phi i32 [ [[ADD6_I]], [[WHILE_BODY7]] ]
45 ; CHECK-T1-NEXT:    [[TMP2:%.*]] = lshr i32 [[ADD6_I_LCSSA]], 15
46 ; CHECK-T1-NEXT:    [[CONV10:%.*]] = trunc i32 [[TMP2]] to i16
47 ; CHECK-T1-NEXT:    [[INCDEC_PTR11]] = getelementptr inbounds i16, i16* [[POUT_01081]], i32 1
48 ; CHECK-T1-NEXT:    store i16 [[CONV10]], i16* [[POUT_01081]], align 2
49 ; CHECK-T1-NEXT:    [[ADD_PTR]] = getelementptr inbounds i16, i16* [[PSRCA_PSRCB]], i32 [[COUNT_01084]]
50 ; CHECK-T1-NEXT:    [[INC]] = add nuw nsw i32 [[COUNT_01084]], 1
51 ; CHECK-T1-NEXT:    [[DEC12]] = add i32 [[BLOCKSIZE1_01083]], -1
52 ; CHECK-T1-NEXT:    [[CMP3:%.*]] = icmp ult i32 [[COUNT_01084]], 3
53 ; CHECK-T1-NEXT:    [[CMP4:%.*]] = icmp ne i32 [[DEC12]], 0
54 ; CHECK-T1-NEXT:    [[TMP3:%.*]] = and i1 [[CMP4]], [[CMP3]]
55 ; CHECK-T1-NEXT:    br i1 [[TMP3]], label [[WHILE_COND5_PREHEADER]], label [[WHILE_END13_LOOPEXIT:%.*]]
56 ; CHECK-T1:       while.end13.loopexit:
57 ; CHECK-T1-NEXT:    [[INCDEC_PTR11_LCSSA:%.*]] = phi i16* [ [[INCDEC_PTR11]], [[WHILE_END]] ]
58 ; CHECK-T1-NEXT:    [[ADD_PTR_LCSSA:%.*]] = phi i16* [ [[ADD_PTR]], [[WHILE_END]] ]
59 ; CHECK-T1-NEXT:    [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_END]] ]
60 ; CHECK-T1-NEXT:    [[DEC12_LCSSA:%.*]] = phi i32 [ [[DEC12]], [[WHILE_END]] ]
61 ; CHECK-T1-NEXT:    br label [[WHILE_END13]]
62 ; CHECK-T1:       while.end13:
63 ; CHECK-T1-NEXT:    [[POUT_0_LCSSA:%.*]] = phi i16* [ [[PDST]], [[ENTRY:%.*]] ], [ [[INCDEC_PTR11_LCSSA]], [[WHILE_END13_LOOPEXIT]] ]
64 ; CHECK-T1-NEXT:    [[PY_0_LCSSA:%.*]] = phi i16* [ [[PSRCA_PSRCB]], [[ENTRY]] ], [ [[ADD_PTR_LCSSA]], [[WHILE_END13_LOOPEXIT]] ]
65 ; CHECK-T1-NEXT:    [[BLOCKSIZE1_0_LCSSA:%.*]] = phi i32 [ [[SUB]], [[ENTRY]] ], [ [[DEC12_LCSSA]], [[WHILE_END13_LOOPEXIT]] ]
66 ; CHECK-T1-NEXT:    [[COUNT_0_LCSSA:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[INC_LCSSA]], [[WHILE_END13_LOOPEXIT]] ]
67 ; CHECK-T1-NEXT:    [[CMP161068:%.*]] = icmp eq i32 [[BLOCKSIZE1_0_LCSSA]], 0
68 ; CHECK-T1-NEXT:    br i1 [[CMP161068]], label [[EXIT:%.*]], label [[WHILE_BODY18_PREHEADER:%.*]]
69 ; CHECK-T1:       while.body18.preheader:
70 ; CHECK-T1-NEXT:    [[ADD_PTR14:%.*]] = getelementptr inbounds i16, i16* [[PY_0_LCSSA]], i32 -1
71 ; CHECK-T1-NEXT:    br label [[WHILE_BODY18:%.*]]
72 ; CHECK-T1:       while.body18:
73 ; CHECK-T1-NEXT:    [[COUNT_11072:%.*]] = phi i32 [ [[INC49:%.*]], [[WHILE_END43:%.*]] ], [ [[COUNT_0_LCSSA]], [[WHILE_BODY18_PREHEADER]] ]
74 ; CHECK-T1-NEXT:    [[BLOCKSIZE1_11071:%.*]] = phi i32 [ [[DEC50:%.*]], [[WHILE_END43]] ], [ [[BLOCKSIZE1_0_LCSSA]], [[WHILE_BODY18_PREHEADER]] ]
75 ; CHECK-T1-NEXT:    [[PY_21070:%.*]] = phi i16* [ [[ADD_PTR48:%.*]], [[WHILE_END43]] ], [ [[ADD_PTR14]], [[WHILE_BODY18_PREHEADER]] ]
76 ; CHECK-T1-NEXT:    [[POUT_11069:%.*]] = phi i16* [ [[INCDEC_PTR46:%.*]], [[WHILE_END43]] ], [ [[POUT_0_LCSSA]], [[WHILE_BODY18_PREHEADER]] ]
77 ; CHECK-T1-NEXT:    [[SHR19:%.*]] = lshr i32 [[COUNT_11072]], 2
78 ; CHECK-T1-NEXT:    [[CMP211054:%.*]] = icmp eq i32 [[SHR19]], 0
79 ; CHECK-T1-NEXT:    br i1 [[CMP211054]], label [[WHILE_END31:%.*]], label [[WHILE_BODY23_PREHEADER:%.*]]
80 ; CHECK-T1:       while.body23.preheader:
81 ; CHECK-T1-NEXT:    br label [[WHILE_BODY23:%.*]]
82 ; CHECK-T1:       while.body23:
83 ; CHECK-T1-NEXT:    [[K_11058:%.*]] = phi i32 [ [[DEC30:%.*]], [[WHILE_BODY23]] ], [ [[SHR19]], [[WHILE_BODY23_PREHEADER]] ]
84 ; CHECK-T1-NEXT:    [[SUM_11057:%.*]] = phi i32 [ [[ADD6_I878:%.*]], [[WHILE_BODY23]] ], [ 0, [[WHILE_BODY23_PREHEADER]] ]
85 ; CHECK-T1-NEXT:    [[PY_31056:%.*]] = phi i16* [ [[ADD_PTR_I884:%.*]], [[WHILE_BODY23]] ], [ [[PY_21070]], [[WHILE_BODY23_PREHEADER]] ]
86 ; CHECK-T1-NEXT:    [[PX_31055:%.*]] = phi i16* [ [[ADD_PTR_I890:%.*]], [[WHILE_BODY23]] ], [ [[PSRCB_PSRCA]], [[WHILE_BODY23_PREHEADER]] ]
87 ; CHECK-T1-NEXT:    [[ARRAYIDX_I907:%.*]] = getelementptr inbounds i16, i16* [[PX_31055]], i32 1
88 ; CHECK-T1-NEXT:    [[TMP4:%.*]] = load i16, i16* [[ARRAYIDX_I907]], align 2
89 ; CHECK-T1-NEXT:    [[TMP5:%.*]] = load i16, i16* [[PX_31055]], align 2
90 ; CHECK-T1-NEXT:    [[ADD_PTR_I912:%.*]] = getelementptr inbounds i16, i16* [[PX_31055]], i32 2
91 ; CHECK-T1-NEXT:    [[ARRAYIDX_I901:%.*]] = getelementptr inbounds i16, i16* [[PY_31056]], i32 1
92 ; CHECK-T1-NEXT:    [[TMP6:%.*]] = load i16, i16* [[ARRAYIDX_I901]], align 2
93 ; CHECK-T1-NEXT:    [[TMP7:%.*]] = load i16, i16* [[PY_31056]], align 2
94 ; CHECK-T1-NEXT:    [[ADD_PTR_I906:%.*]] = getelementptr inbounds i16, i16* [[PY_31056]], i32 -2
95 ; CHECK-T1-NEXT:    [[SHR_I892:%.*]] = sext i16 [[TMP5]] to i32
96 ; CHECK-T1-NEXT:    [[SHR1_I893:%.*]] = sext i16 [[TMP6]] to i32
97 ; CHECK-T1-NEXT:    [[MUL_I894:%.*]] = mul nsw i32 [[SHR1_I893]], [[SHR_I892]]
98 ; CHECK-T1-NEXT:    [[SHR2_I895:%.*]] = sext i16 [[TMP4]] to i32
99 ; CHECK-T1-NEXT:    [[SHR4_I897:%.*]] = sext i16 [[TMP7]] to i32
100 ; CHECK-T1-NEXT:    [[MUL5_I898:%.*]] = mul nsw i32 [[SHR4_I897]], [[SHR2_I895]]
101 ; CHECK-T1-NEXT:    [[ADD_I899:%.*]] = add i32 [[MUL_I894]], [[SUM_11057]]
102 ; CHECK-T1-NEXT:    [[ADD6_I900:%.*]] = add i32 [[ADD_I899]], [[MUL5_I898]]
103 ; CHECK-T1-NEXT:    [[ARRAYIDX_I885:%.*]] = getelementptr inbounds i16, i16* [[PX_31055]], i32 3
104 ; CHECK-T1-NEXT:    [[TMP8:%.*]] = load i16, i16* [[ARRAYIDX_I885]], align 2
105 ; CHECK-T1-NEXT:    [[TMP9:%.*]] = load i16, i16* [[ADD_PTR_I912]], align 2
106 ; CHECK-T1-NEXT:    [[ADD_PTR_I890]] = getelementptr inbounds i16, i16* [[PX_31055]], i32 4
107 ; CHECK-T1-NEXT:    [[ARRAYIDX_I879:%.*]] = getelementptr inbounds i16, i16* [[PY_31056]], i32 -1
108 ; CHECK-T1-NEXT:    [[TMP10:%.*]] = load i16, i16* [[ARRAYIDX_I879]], align 2
109 ; CHECK-T1-NEXT:    [[TMP11:%.*]] = load i16, i16* [[ADD_PTR_I906]], align 2
110 ; CHECK-T1-NEXT:    [[ADD_PTR_I884]] = getelementptr inbounds i16, i16* [[PY_31056]], i32 -4
111 ; CHECK-T1-NEXT:    [[SHR_I870:%.*]] = sext i16 [[TMP9]] to i32
112 ; CHECK-T1-NEXT:    [[SHR1_I871:%.*]] = sext i16 [[TMP10]] to i32
113 ; CHECK-T1-NEXT:    [[MUL_I872:%.*]] = mul nsw i32 [[SHR1_I871]], [[SHR_I870]]
114 ; CHECK-T1-NEXT:    [[SHR2_I873:%.*]] = sext i16 [[TMP8]] to i32
115 ; CHECK-T1-NEXT:    [[SHR4_I875:%.*]] = sext i16 [[TMP11]] to i32
116 ; CHECK-T1-NEXT:    [[MUL5_I876:%.*]] = mul nsw i32 [[SHR4_I875]], [[SHR2_I873]]
117 ; CHECK-T1-NEXT:    [[ADD_I877:%.*]] = add i32 [[ADD6_I900]], [[MUL_I872]]
118 ; CHECK-T1-NEXT:    [[ADD6_I878]] = add i32 [[ADD_I877]], [[MUL5_I876]]
119 ; CHECK-T1-NEXT:    [[DEC30]] = add nsw i32 [[K_11058]], -1
120 ; CHECK-T1-NEXT:    [[CMP21:%.*]] = icmp eq i32 [[DEC30]], 0
121 ; CHECK-T1-NEXT:    br i1 [[CMP21]], label [[WHILE_END31_LOOPEXIT:%.*]], label [[WHILE_BODY23]]
122 ; CHECK-T1:       while.end31.loopexit:
123 ; CHECK-T1-NEXT:    [[ADD_PTR_I890_LCSSA:%.*]] = phi i16* [ [[ADD_PTR_I890]], [[WHILE_BODY23]] ]
124 ; CHECK-T1-NEXT:    [[ADD_PTR_I884_LCSSA:%.*]] = phi i16* [ [[ADD_PTR_I884]], [[WHILE_BODY23]] ]
125 ; CHECK-T1-NEXT:    [[ADD6_I878_LCSSA:%.*]] = phi i32 [ [[ADD6_I878]], [[WHILE_BODY23]] ]
126 ; CHECK-T1-NEXT:    br label [[WHILE_END31]]
127 ; CHECK-T1:       while.end31:
128 ; CHECK-T1-NEXT:    [[PX_3_LCSSA:%.*]] = phi i16* [ [[PSRCB_PSRCA]], [[WHILE_BODY18]] ], [ [[ADD_PTR_I890_LCSSA]], [[WHILE_END31_LOOPEXIT]] ]
129 ; CHECK-T1-NEXT:    [[PY_3_LCSSA:%.*]] = phi i16* [ [[PY_21070]], [[WHILE_BODY18]] ], [ [[ADD_PTR_I884_LCSSA]], [[WHILE_END31_LOOPEXIT]] ]
130 ; CHECK-T1-NEXT:    [[SUM_1_LCSSA:%.*]] = phi i32 [ 0, [[WHILE_BODY18]] ], [ [[ADD6_I878_LCSSA]], [[WHILE_END31_LOOPEXIT]] ]
131 ; CHECK-T1-NEXT:    [[REM:%.*]] = and i32 [[COUNT_11072]], 3
132 ; CHECK-T1-NEXT:    [[CMP341062:%.*]] = icmp eq i32 [[REM]], 0
133 ; CHECK-T1-NEXT:    br i1 [[CMP341062]], label [[WHILE_END43]], label [[WHILE_BODY36_PREHEADER:%.*]]
134 ; CHECK-T1:       while.body36.preheader:
135 ; CHECK-T1-NEXT:    [[ADD_PTR32:%.*]] = getelementptr inbounds i16, i16* [[PY_3_LCSSA]], i32 1
136 ; CHECK-T1-NEXT:    br label [[WHILE_BODY36:%.*]]
137 ; CHECK-T1:       while.body36:
138 ; CHECK-T1-NEXT:    [[K_21066:%.*]] = phi i32 [ [[DEC42:%.*]], [[WHILE_BODY36]] ], [ [[REM]], [[WHILE_BODY36_PREHEADER]] ]
139 ; CHECK-T1-NEXT:    [[SUM_21065:%.*]] = phi i32 [ [[ADD6_I868:%.*]], [[WHILE_BODY36]] ], [ [[SUM_1_LCSSA]], [[WHILE_BODY36_PREHEADER]] ]
140 ; CHECK-T1-NEXT:    [[PY_41064:%.*]] = phi i16* [ [[INCDEC_PTR39:%.*]], [[WHILE_BODY36]] ], [ [[ADD_PTR32]], [[WHILE_BODY36_PREHEADER]] ]
141 ; CHECK-T1-NEXT:    [[PX_41063:%.*]] = phi i16* [ [[INCDEC_PTR37:%.*]], [[WHILE_BODY36]] ], [ [[PX_3_LCSSA]], [[WHILE_BODY36_PREHEADER]] ]
142 ; CHECK-T1-NEXT:    [[INCDEC_PTR37]] = getelementptr inbounds i16, i16* [[PX_41063]], i32 1
143 ; CHECK-T1-NEXT:    [[TMP12:%.*]] = load i16, i16* [[PX_41063]], align 2
144 ; CHECK-T1-NEXT:    [[CONV38:%.*]] = sext i16 [[TMP12]] to i32
145 ; CHECK-T1-NEXT:    [[INCDEC_PTR39]] = getelementptr inbounds i16, i16* [[PY_41064]], i32 -1
146 ; CHECK-T1-NEXT:    [[TMP13:%.*]] = load i16, i16* [[PY_41064]], align 2
147 ; CHECK-T1-NEXT:    [[CONV40:%.*]] = sext i16 [[TMP13]] to i32
148 ; CHECK-T1-NEXT:    [[MUL_I863:%.*]] = mul nsw i32 [[CONV40]], [[CONV38]]
149 ; CHECK-T1-NEXT:    [[SHR3_I864:%.*]] = ashr i32 [[CONV38]], 16
150 ; CHECK-T1-NEXT:    [[SHR4_I865:%.*]] = ashr i32 [[CONV40]], 16
151 ; CHECK-T1-NEXT:    [[MUL5_I866:%.*]] = mul nsw i32 [[SHR4_I865]], [[SHR3_I864]]
152 ; CHECK-T1-NEXT:    [[ADD_I867:%.*]] = add i32 [[MUL_I863]], [[SUM_21065]]
153 ; CHECK-T1-NEXT:    [[ADD6_I868]] = add i32 [[ADD_I867]], [[MUL5_I866]]
154 ; CHECK-T1-NEXT:    [[DEC42]] = add nsw i32 [[K_21066]], -1
155 ; CHECK-T1-NEXT:    [[CMP34:%.*]] = icmp eq i32 [[DEC42]], 0
156 ; CHECK-T1-NEXT:    br i1 [[CMP34]], label [[WHILE_END43_LOOPEXIT:%.*]], label [[WHILE_BODY36]]
157 ; CHECK-T1:       while.end43.loopexit:
158 ; CHECK-T1-NEXT:    [[ADD6_I868_LCSSA:%.*]] = phi i32 [ [[ADD6_I868]], [[WHILE_BODY36]] ]
159 ; CHECK-T1-NEXT:    br label [[WHILE_END43]]
160 ; CHECK-T1:       while.end43:
161 ; CHECK-T1-NEXT:    [[SUM_2_LCSSA:%.*]] = phi i32 [ [[SUM_1_LCSSA]], [[WHILE_END31]] ], [ [[ADD6_I868_LCSSA]], [[WHILE_END43_LOOPEXIT]] ]
162 ; CHECK-T1-NEXT:    [[TMP14:%.*]] = lshr i32 [[SUM_2_LCSSA]], 15
163 ; CHECK-T1-NEXT:    [[CONV45:%.*]] = trunc i32 [[TMP14]] to i16
164 ; CHECK-T1-NEXT:    [[INCDEC_PTR46]] = getelementptr inbounds i16, i16* [[POUT_11069]], i32 1
165 ; CHECK-T1-NEXT:    store i16 [[CONV45]], i16* [[POUT_11069]], align 2
166 ; CHECK-T1-NEXT:    [[SUB47:%.*]] = add i32 [[COUNT_11072]], -1
167 ; CHECK-T1-NEXT:    [[ADD_PTR48]] = getelementptr inbounds i16, i16* [[PSRCA_PSRCB]], i32 [[SUB47]]
168 ; CHECK-T1-NEXT:    [[INC49]] = add i32 [[COUNT_11072]], 1
169 ; CHECK-T1-NEXT:    [[DEC50]] = add i32 [[BLOCKSIZE1_11071]], -1
170 ; CHECK-T1-NEXT:    [[CMP16:%.*]] = icmp eq i32 [[DEC50]], 0
171 ; CHECK-T1-NEXT:    br i1 [[CMP16]], label [[EXIT_LOOPEXIT:%.*]], label [[WHILE_BODY18]]
172 ; CHECK-T1:       exit.loopexit:
173 ; CHECK-T1-NEXT:    br label [[EXIT]]
174 ; CHECK-T1:       exit:
175 ; CHECK-T1-NEXT:    ret void
177 ; CHECK-T2-LABEL: @arm_conv_fast_q15(
178 ; CHECK-T2-NEXT:  entry:
179 ; CHECK-T2-NEXT:    [[CMP:%.*]] = icmp ult i32 [[SRCALEN:%.*]], [[SRCBLEN:%.*]]
180 ; CHECK-T2-NEXT:    [[SRCALEN_SRCBLEN:%.*]] = select i1 [[CMP]], i32 [[SRCALEN]], i32 [[SRCBLEN]]
181 ; CHECK-T2-NEXT:    [[PSRCB_PSRCA:%.*]] = select i1 [[CMP]], i16* [[PSRCB:%.*]], i16* [[PSRCA:%.*]]
182 ; CHECK-T2-NEXT:    [[PSRCA_PSRCB:%.*]] = select i1 [[CMP]], i16* [[PSRCA]], i16* [[PSRCB]]
183 ; CHECK-T2-NEXT:    [[SUB:%.*]] = add i32 [[SRCALEN_SRCBLEN]], -1
184 ; CHECK-T2-NEXT:    [[CMP41080:%.*]] = icmp eq i32 [[SUB]], 0
185 ; CHECK-T2-NEXT:    br i1 [[CMP41080]], label [[WHILE_END13:%.*]], label [[WHILE_COND5_PREHEADER_PREHEADER:%.*]]
186 ; CHECK-T2:       while.cond5.preheader.preheader:
187 ; CHECK-T2-NEXT:    br label [[WHILE_COND5_PREHEADER:%.*]]
188 ; CHECK-T2:       while.cond5.preheader:
189 ; CHECK-T2-NEXT:    [[COUNT_01084:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_END:%.*]] ], [ 1, [[WHILE_COND5_PREHEADER_PREHEADER]] ]
190 ; CHECK-T2-NEXT:    [[BLOCKSIZE1_01083:%.*]] = phi i32 [ [[DEC12:%.*]], [[WHILE_END]] ], [ [[SUB]], [[WHILE_COND5_PREHEADER_PREHEADER]] ]
191 ; CHECK-T2-NEXT:    [[PY_01082:%.*]] = phi i16* [ [[ADD_PTR:%.*]], [[WHILE_END]] ], [ [[PSRCA_PSRCB]], [[WHILE_COND5_PREHEADER_PREHEADER]] ]
192 ; CHECK-T2-NEXT:    [[POUT_01081:%.*]] = phi i16* [ [[INCDEC_PTR11:%.*]], [[WHILE_END]] ], [ [[PDST:%.*]], [[WHILE_COND5_PREHEADER_PREHEADER]] ]
193 ; CHECK-T2-NEXT:    br label [[WHILE_BODY7:%.*]]
194 ; CHECK-T2:       while.body7:
195 ; CHECK-T2-NEXT:    [[K_01078:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY7]] ], [ [[COUNT_01084]], [[WHILE_COND5_PREHEADER]] ]
196 ; CHECK-T2-NEXT:    [[SUM_01077:%.*]] = phi i32 [ [[ADD6_I:%.*]], [[WHILE_BODY7]] ], [ 0, [[WHILE_COND5_PREHEADER]] ]
197 ; CHECK-T2-NEXT:    [[PY_11076:%.*]] = phi i16* [ [[INCDEC_PTR8:%.*]], [[WHILE_BODY7]] ], [ [[PY_01082]], [[WHILE_COND5_PREHEADER]] ]
198 ; CHECK-T2-NEXT:    [[PX_11075:%.*]] = phi i16* [ [[INCDEC_PTR:%.*]], [[WHILE_BODY7]] ], [ [[PSRCB_PSRCA]], [[WHILE_COND5_PREHEADER]] ]
199 ; CHECK-T2-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i16, i16* [[PX_11075]], i32 1
200 ; CHECK-T2-NEXT:    [[TMP0:%.*]] = load i16, i16* [[PX_11075]], align 2
201 ; CHECK-T2-NEXT:    [[CONV:%.*]] = sext i16 [[TMP0]] to i32
202 ; CHECK-T2-NEXT:    [[INCDEC_PTR8]] = getelementptr inbounds i16, i16* [[PY_11076]], i32 -1
203 ; CHECK-T2-NEXT:    [[TMP1:%.*]] = load i16, i16* [[PY_11076]], align 2
204 ; CHECK-T2-NEXT:    [[CONV9:%.*]] = sext i16 [[TMP1]] to i32
205 ; CHECK-T2-NEXT:    [[MUL_I:%.*]] = mul nsw i32 [[CONV9]], [[CONV]]
206 ; CHECK-T2-NEXT:    [[SHR3_I:%.*]] = ashr i32 [[CONV]], 16
207 ; CHECK-T2-NEXT:    [[SHR4_I:%.*]] = ashr i32 [[CONV9]], 16
208 ; CHECK-T2-NEXT:    [[MUL5_I:%.*]] = mul nsw i32 [[SHR4_I]], [[SHR3_I]]
209 ; CHECK-T2-NEXT:    [[ADD_I:%.*]] = add i32 [[MUL_I]], [[SUM_01077]]
210 ; CHECK-T2-NEXT:    [[ADD6_I]] = add i32 [[ADD_I]], [[MUL5_I]]
211 ; CHECK-T2-NEXT:    [[DEC]] = add nsw i32 [[K_01078]], -1
212 ; CHECK-T2-NEXT:    [[CMP6:%.*]] = icmp eq i32 [[DEC]], 0
213 ; CHECK-T2-NEXT:    br i1 [[CMP6]], label [[WHILE_END]], label [[WHILE_BODY7]]
214 ; CHECK-T2:       while.end:
215 ; CHECK-T2-NEXT:    [[ADD6_I_LCSSA:%.*]] = phi i32 [ [[ADD6_I]], [[WHILE_BODY7]] ]
216 ; CHECK-T2-NEXT:    [[TMP2:%.*]] = lshr i32 [[ADD6_I_LCSSA]], 15
217 ; CHECK-T2-NEXT:    [[CONV10:%.*]] = trunc i32 [[TMP2]] to i16
218 ; CHECK-T2-NEXT:    [[INCDEC_PTR11]] = getelementptr inbounds i16, i16* [[POUT_01081]], i32 1
219 ; CHECK-T2-NEXT:    store i16 [[CONV10]], i16* [[POUT_01081]], align 2
220 ; CHECK-T2-NEXT:    [[ADD_PTR]] = getelementptr inbounds i16, i16* [[PSRCA_PSRCB]], i32 [[COUNT_01084]]
221 ; CHECK-T2-NEXT:    [[INC]] = add nuw nsw i32 [[COUNT_01084]], 1
222 ; CHECK-T2-NEXT:    [[DEC12]] = add i32 [[BLOCKSIZE1_01083]], -1
223 ; CHECK-T2-NEXT:    [[CMP3:%.*]] = icmp ult i32 [[COUNT_01084]], 3
224 ; CHECK-T2-NEXT:    [[CMP4:%.*]] = icmp ne i32 [[DEC12]], 0
225 ; CHECK-T2-NEXT:    [[TMP3:%.*]] = and i1 [[CMP4]], [[CMP3]]
226 ; CHECK-T2-NEXT:    br i1 [[TMP3]], label [[WHILE_COND5_PREHEADER]], label [[WHILE_END13_LOOPEXIT:%.*]]
227 ; CHECK-T2:       while.end13.loopexit:
228 ; CHECK-T2-NEXT:    [[INCDEC_PTR11_LCSSA:%.*]] = phi i16* [ [[INCDEC_PTR11]], [[WHILE_END]] ]
229 ; CHECK-T2-NEXT:    [[ADD_PTR_LCSSA:%.*]] = phi i16* [ [[ADD_PTR]], [[WHILE_END]] ]
230 ; CHECK-T2-NEXT:    [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_END]] ]
231 ; CHECK-T2-NEXT:    [[DEC12_LCSSA:%.*]] = phi i32 [ [[DEC12]], [[WHILE_END]] ]
232 ; CHECK-T2-NEXT:    br label [[WHILE_END13]]
233 ; CHECK-T2:       while.end13:
234 ; CHECK-T2-NEXT:    [[POUT_0_LCSSA:%.*]] = phi i16* [ [[PDST]], [[ENTRY:%.*]] ], [ [[INCDEC_PTR11_LCSSA]], [[WHILE_END13_LOOPEXIT]] ]
235 ; CHECK-T2-NEXT:    [[PY_0_LCSSA:%.*]] = phi i16* [ [[PSRCA_PSRCB]], [[ENTRY]] ], [ [[ADD_PTR_LCSSA]], [[WHILE_END13_LOOPEXIT]] ]
236 ; CHECK-T2-NEXT:    [[BLOCKSIZE1_0_LCSSA:%.*]] = phi i32 [ [[SUB]], [[ENTRY]] ], [ [[DEC12_LCSSA]], [[WHILE_END13_LOOPEXIT]] ]
237 ; CHECK-T2-NEXT:    [[COUNT_0_LCSSA:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[INC_LCSSA]], [[WHILE_END13_LOOPEXIT]] ]
238 ; CHECK-T2-NEXT:    [[CMP161068:%.*]] = icmp eq i32 [[BLOCKSIZE1_0_LCSSA]], 0
239 ; CHECK-T2-NEXT:    br i1 [[CMP161068]], label [[EXIT:%.*]], label [[WHILE_BODY18_PREHEADER:%.*]]
240 ; CHECK-T2:       while.body18.preheader:
241 ; CHECK-T2-NEXT:    [[ADD_PTR14:%.*]] = getelementptr inbounds i16, i16* [[PY_0_LCSSA]], i32 -1
242 ; CHECK-T2-NEXT:    br label [[WHILE_BODY18:%.*]]
243 ; CHECK-T2:       while.body18:
244 ; CHECK-T2-NEXT:    [[COUNT_11072:%.*]] = phi i32 [ [[INC49:%.*]], [[WHILE_END43:%.*]] ], [ [[COUNT_0_LCSSA]], [[WHILE_BODY18_PREHEADER]] ]
245 ; CHECK-T2-NEXT:    [[BLOCKSIZE1_11071:%.*]] = phi i32 [ [[DEC50:%.*]], [[WHILE_END43]] ], [ [[BLOCKSIZE1_0_LCSSA]], [[WHILE_BODY18_PREHEADER]] ]
246 ; CHECK-T2-NEXT:    [[PY_21070:%.*]] = phi i16* [ [[ADD_PTR48:%.*]], [[WHILE_END43]] ], [ [[ADD_PTR14]], [[WHILE_BODY18_PREHEADER]] ]
247 ; CHECK-T2-NEXT:    [[POUT_11069:%.*]] = phi i16* [ [[INCDEC_PTR46:%.*]], [[WHILE_END43]] ], [ [[POUT_0_LCSSA]], [[WHILE_BODY18_PREHEADER]] ]
248 ; CHECK-T2-NEXT:    [[SHR19:%.*]] = lshr i32 [[COUNT_11072]], 2
249 ; CHECK-T2-NEXT:    [[CMP211054:%.*]] = icmp eq i32 [[SHR19]], 0
250 ; CHECK-T2-NEXT:    br i1 [[CMP211054]], label [[WHILE_END31:%.*]], label [[WHILE_BODY23_PREHEADER:%.*]]
251 ; CHECK-T2:       while.body23.preheader:
252 ; CHECK-T2-NEXT:    br label [[WHILE_BODY23:%.*]]
253 ; CHECK-T2:       while.body23:
254 ; CHECK-T2-NEXT:    [[K_11058:%.*]] = phi i32 [ [[DEC30:%.*]], [[WHILE_BODY23]] ], [ [[SHR19]], [[WHILE_BODY23_PREHEADER]] ]
255 ; CHECK-T2-NEXT:    [[SUM_11057:%.*]] = phi i32 [ [[ADD6_I878:%.*]], [[WHILE_BODY23]] ], [ 0, [[WHILE_BODY23_PREHEADER]] ]
256 ; CHECK-T2-NEXT:    [[PY_31056:%.*]] = phi i16* [ [[ADD_PTR_I884:%.*]], [[WHILE_BODY23]] ], [ [[PY_21070]], [[WHILE_BODY23_PREHEADER]] ]
257 ; CHECK-T2-NEXT:    [[PX_31055:%.*]] = phi i16* [ [[ADD_PTR_I890:%.*]], [[WHILE_BODY23]] ], [ [[PSRCB_PSRCA]], [[WHILE_BODY23_PREHEADER]] ]
258 ; CHECK-T2-NEXT:    [[ARRAYIDX_I907:%.*]] = getelementptr inbounds i16, i16* [[PX_31055]], i32 1
259 ; CHECK-T2-NEXT:    [[TMP4:%.*]] = load i16, i16* [[ARRAYIDX_I907]], align 2
260 ; CHECK-T2-NEXT:    [[TMP5:%.*]] = load i16, i16* [[PX_31055]], align 2
261 ; CHECK-T2-NEXT:    [[ADD_PTR_I912:%.*]] = getelementptr inbounds i16, i16* [[PX_31055]], i32 2
262 ; CHECK-T2-NEXT:    [[ARRAYIDX_I901:%.*]] = getelementptr inbounds i16, i16* [[PY_31056]], i32 1
263 ; CHECK-T2-NEXT:    [[TMP6:%.*]] = load i16, i16* [[ARRAYIDX_I901]], align 2
264 ; CHECK-T2-NEXT:    [[TMP7:%.*]] = load i16, i16* [[PY_31056]], align 2
265 ; CHECK-T2-NEXT:    [[ADD_PTR_I906:%.*]] = getelementptr inbounds i16, i16* [[PY_31056]], i32 -2
266 ; CHECK-T2-NEXT:    [[SHR_I892:%.*]] = sext i16 [[TMP5]] to i32
267 ; CHECK-T2-NEXT:    [[SHR1_I893:%.*]] = sext i16 [[TMP6]] to i32
268 ; CHECK-T2-NEXT:    [[MUL_I894:%.*]] = mul nsw i32 [[SHR1_I893]], [[SHR_I892]]
269 ; CHECK-T2-NEXT:    [[SHR2_I895:%.*]] = sext i16 [[TMP4]] to i32
270 ; CHECK-T2-NEXT:    [[SHR4_I897:%.*]] = sext i16 [[TMP7]] to i32
271 ; CHECK-T2-NEXT:    [[MUL5_I898:%.*]] = mul nsw i32 [[SHR4_I897]], [[SHR2_I895]]
272 ; CHECK-T2-NEXT:    [[ADD_I899:%.*]] = add i32 [[MUL_I894]], [[SUM_11057]]
273 ; CHECK-T2-NEXT:    [[ADD6_I900:%.*]] = add i32 [[ADD_I899]], [[MUL5_I898]]
274 ; CHECK-T2-NEXT:    [[ARRAYIDX_I885:%.*]] = getelementptr inbounds i16, i16* [[PX_31055]], i32 3
275 ; CHECK-T2-NEXT:    [[TMP8:%.*]] = load i16, i16* [[ARRAYIDX_I885]], align 2
276 ; CHECK-T2-NEXT:    [[TMP9:%.*]] = load i16, i16* [[ADD_PTR_I912]], align 2
277 ; CHECK-T2-NEXT:    [[ADD_PTR_I890]] = getelementptr inbounds i16, i16* [[PX_31055]], i32 4
278 ; CHECK-T2-NEXT:    [[ARRAYIDX_I879:%.*]] = getelementptr inbounds i16, i16* [[PY_31056]], i32 -1
279 ; CHECK-T2-NEXT:    [[TMP10:%.*]] = load i16, i16* [[ARRAYIDX_I879]], align 2
280 ; CHECK-T2-NEXT:    [[TMP11:%.*]] = load i16, i16* [[ADD_PTR_I906]], align 2
281 ; CHECK-T2-NEXT:    [[ADD_PTR_I884]] = getelementptr inbounds i16, i16* [[PY_31056]], i32 -4
282 ; CHECK-T2-NEXT:    [[SHR_I870:%.*]] = sext i16 [[TMP9]] to i32
283 ; CHECK-T2-NEXT:    [[SHR1_I871:%.*]] = sext i16 [[TMP10]] to i32
284 ; CHECK-T2-NEXT:    [[MUL_I872:%.*]] = mul nsw i32 [[SHR1_I871]], [[SHR_I870]]
285 ; CHECK-T2-NEXT:    [[SHR2_I873:%.*]] = sext i16 [[TMP8]] to i32
286 ; CHECK-T2-NEXT:    [[SHR4_I875:%.*]] = sext i16 [[TMP11]] to i32
287 ; CHECK-T2-NEXT:    [[MUL5_I876:%.*]] = mul nsw i32 [[SHR4_I875]], [[SHR2_I873]]
288 ; CHECK-T2-NEXT:    [[ADD_I877:%.*]] = add i32 [[ADD6_I900]], [[MUL_I872]]
289 ; CHECK-T2-NEXT:    [[ADD6_I878]] = add i32 [[ADD_I877]], [[MUL5_I876]]
290 ; CHECK-T2-NEXT:    [[DEC30]] = add nsw i32 [[K_11058]], -1
291 ; CHECK-T2-NEXT:    [[CMP21:%.*]] = icmp eq i32 [[DEC30]], 0
292 ; CHECK-T2-NEXT:    br i1 [[CMP21]], label [[WHILE_END31_LOOPEXIT:%.*]], label [[WHILE_BODY23]]
293 ; CHECK-T2:       while.end31.loopexit:
294 ; CHECK-T2-NEXT:    [[ADD_PTR_I890_LCSSA:%.*]] = phi i16* [ [[ADD_PTR_I890]], [[WHILE_BODY23]] ]
295 ; CHECK-T2-NEXT:    [[ADD_PTR_I884_LCSSA:%.*]] = phi i16* [ [[ADD_PTR_I884]], [[WHILE_BODY23]] ]
296 ; CHECK-T2-NEXT:    [[ADD6_I878_LCSSA:%.*]] = phi i32 [ [[ADD6_I878]], [[WHILE_BODY23]] ]
297 ; CHECK-T2-NEXT:    br label [[WHILE_END31]]
298 ; CHECK-T2:       while.end31:
299 ; CHECK-T2-NEXT:    [[PX_3_LCSSA:%.*]] = phi i16* [ [[PSRCB_PSRCA]], [[WHILE_BODY18]] ], [ [[ADD_PTR_I890_LCSSA]], [[WHILE_END31_LOOPEXIT]] ]
300 ; CHECK-T2-NEXT:    [[PY_3_LCSSA:%.*]] = phi i16* [ [[PY_21070]], [[WHILE_BODY18]] ], [ [[ADD_PTR_I884_LCSSA]], [[WHILE_END31_LOOPEXIT]] ]
301 ; CHECK-T2-NEXT:    [[SUM_1_LCSSA:%.*]] = phi i32 [ 0, [[WHILE_BODY18]] ], [ [[ADD6_I878_LCSSA]], [[WHILE_END31_LOOPEXIT]] ]
302 ; CHECK-T2-NEXT:    [[REM:%.*]] = and i32 [[COUNT_11072]], 3
303 ; CHECK-T2-NEXT:    [[CMP341062:%.*]] = icmp eq i32 [[REM]], 0
304 ; CHECK-T2-NEXT:    br i1 [[CMP341062]], label [[WHILE_END43]], label [[WHILE_BODY36_PREHEADER:%.*]]
305 ; CHECK-T2:       while.body36.preheader:
306 ; CHECK-T2-NEXT:    [[ADD_PTR32:%.*]] = getelementptr inbounds i16, i16* [[PY_3_LCSSA]], i32 1
307 ; CHECK-T2-NEXT:    br label [[WHILE_BODY36:%.*]]
308 ; CHECK-T2:       while.body36:
309 ; CHECK-T2-NEXT:    [[K_21066:%.*]] = phi i32 [ [[DEC42:%.*]], [[WHILE_BODY36]] ], [ [[REM]], [[WHILE_BODY36_PREHEADER]] ]
310 ; CHECK-T2-NEXT:    [[SUM_21065:%.*]] = phi i32 [ [[ADD6_I868:%.*]], [[WHILE_BODY36]] ], [ [[SUM_1_LCSSA]], [[WHILE_BODY36_PREHEADER]] ]
311 ; CHECK-T2-NEXT:    [[PY_41064:%.*]] = phi i16* [ [[INCDEC_PTR39:%.*]], [[WHILE_BODY36]] ], [ [[ADD_PTR32]], [[WHILE_BODY36_PREHEADER]] ]
312 ; CHECK-T2-NEXT:    [[PX_41063:%.*]] = phi i16* [ [[INCDEC_PTR37:%.*]], [[WHILE_BODY36]] ], [ [[PX_3_LCSSA]], [[WHILE_BODY36_PREHEADER]] ]
313 ; CHECK-T2-NEXT:    [[INCDEC_PTR37]] = getelementptr inbounds i16, i16* [[PX_41063]], i32 1
314 ; CHECK-T2-NEXT:    [[TMP12:%.*]] = load i16, i16* [[PX_41063]], align 2
315 ; CHECK-T2-NEXT:    [[CONV38:%.*]] = sext i16 [[TMP12]] to i32
316 ; CHECK-T2-NEXT:    [[INCDEC_PTR39]] = getelementptr inbounds i16, i16* [[PY_41064]], i32 -1
317 ; CHECK-T2-NEXT:    [[TMP13:%.*]] = load i16, i16* [[PY_41064]], align 2
318 ; CHECK-T2-NEXT:    [[CONV40:%.*]] = sext i16 [[TMP13]] to i32
319 ; CHECK-T2-NEXT:    [[MUL_I863:%.*]] = mul nsw i32 [[CONV40]], [[CONV38]]
320 ; CHECK-T2-NEXT:    [[SHR3_I864:%.*]] = ashr i32 [[CONV38]], 16
321 ; CHECK-T2-NEXT:    [[SHR4_I865:%.*]] = ashr i32 [[CONV40]], 16
322 ; CHECK-T2-NEXT:    [[MUL5_I866:%.*]] = mul nsw i32 [[SHR4_I865]], [[SHR3_I864]]
323 ; CHECK-T2-NEXT:    [[ADD_I867:%.*]] = add i32 [[MUL_I863]], [[SUM_21065]]
324 ; CHECK-T2-NEXT:    [[ADD6_I868]] = add i32 [[ADD_I867]], [[MUL5_I866]]
325 ; CHECK-T2-NEXT:    [[DEC42]] = add nsw i32 [[K_21066]], -1
326 ; CHECK-T2-NEXT:    [[CMP34:%.*]] = icmp eq i32 [[DEC42]], 0
327 ; CHECK-T2-NEXT:    br i1 [[CMP34]], label [[WHILE_END43_LOOPEXIT:%.*]], label [[WHILE_BODY36]]
328 ; CHECK-T2:       while.end43.loopexit:
329 ; CHECK-T2-NEXT:    [[ADD6_I868_LCSSA:%.*]] = phi i32 [ [[ADD6_I868]], [[WHILE_BODY36]] ]
330 ; CHECK-T2-NEXT:    br label [[WHILE_END43]]
331 ; CHECK-T2:       while.end43:
332 ; CHECK-T2-NEXT:    [[SUM_2_LCSSA:%.*]] = phi i32 [ [[SUM_1_LCSSA]], [[WHILE_END31]] ], [ [[ADD6_I868_LCSSA]], [[WHILE_END43_LOOPEXIT]] ]
333 ; CHECK-T2-NEXT:    [[TMP14:%.*]] = lshr i32 [[SUM_2_LCSSA]], 15
334 ; CHECK-T2-NEXT:    [[CONV45:%.*]] = trunc i32 [[TMP14]] to i16
335 ; CHECK-T2-NEXT:    [[INCDEC_PTR46]] = getelementptr inbounds i16, i16* [[POUT_11069]], i32 1
336 ; CHECK-T2-NEXT:    store i16 [[CONV45]], i16* [[POUT_11069]], align 2
337 ; CHECK-T2-NEXT:    [[SUB47:%.*]] = add i32 [[COUNT_11072]], -1
338 ; CHECK-T2-NEXT:    [[ADD_PTR48]] = getelementptr inbounds i16, i16* [[PSRCA_PSRCB]], i32 [[SUB47]]
339 ; CHECK-T2-NEXT:    [[INC49]] = add i32 [[COUNT_11072]], 1
340 ; CHECK-T2-NEXT:    [[DEC50]] = add i32 [[BLOCKSIZE1_11071]], -1
341 ; CHECK-T2-NEXT:    [[CMP16:%.*]] = icmp eq i32 [[DEC50]], 0
342 ; CHECK-T2-NEXT:    br i1 [[CMP16]], label [[EXIT_LOOPEXIT:%.*]], label [[WHILE_BODY18]]
343 ; CHECK-T2:       exit.loopexit:
344 ; CHECK-T2-NEXT:    br label [[EXIT]]
345 ; CHECK-T2:       exit:
346 ; CHECK-T2-NEXT:    ret void
348 entry:
349   %cmp = icmp ult i32 %srcALen, %srcBLen
350   %srcALen.srcBLen = select i1 %cmp, i32 %srcALen, i32 %srcBLen
351   %pSrcB.pSrcA = select i1 %cmp, i16* %pSrcB, i16* %pSrcA
352   %pSrcA.pSrcB = select i1 %cmp, i16* %pSrcA, i16* %pSrcB
353   %sub = add i32 %srcALen.srcBLen, -1
354   %cmp41080 = icmp eq i32 %sub, 0
355   br i1 %cmp41080, label %while.end13, label %while.cond5.preheader
357 while.cond5.preheader:                            ; preds = %while.end, %entry
358   %count.01084 = phi i32 [ %inc, %while.end ], [ 1, %entry ]
359   %blockSize1.01083 = phi i32 [ %dec12, %while.end ], [ %sub, %entry ]
360   %py.01082 = phi i16* [ %add.ptr, %while.end ], [ %pSrcA.pSrcB, %entry ]
361   %pOut.01081 = phi i16* [ %incdec.ptr11, %while.end ], [ %pDst, %entry ]
362   br label %while.body7
364 while.body7:                                      ; preds = %while.body7, %while.cond5.preheader
365   %k.01078 = phi i32 [ %dec, %while.body7 ], [ %count.01084, %while.cond5.preheader ]
366   %sum.01077 = phi i32 [ %add6.i, %while.body7 ], [ 0, %while.cond5.preheader ]
367   %py.11076 = phi i16* [ %incdec.ptr8, %while.body7 ], [ %py.01082, %while.cond5.preheader ]
368   %px.11075 = phi i16* [ %incdec.ptr, %while.body7 ], [ %pSrcB.pSrcA, %while.cond5.preheader ]
369   %incdec.ptr = getelementptr inbounds i16, i16* %px.11075, i32 1
370   %0 = load i16, i16* %px.11075, align 2
371   %conv = sext i16 %0 to i32
372   %incdec.ptr8 = getelementptr inbounds i16, i16* %py.11076, i32 -1
373   %1 = load i16, i16* %py.11076, align 2
374   %conv9 = sext i16 %1 to i32
375   %mul.i = mul nsw i32 %conv9, %conv
376   %shr3.i = ashr i32 %conv, 16
377   %shr4.i = ashr i32 %conv9, 16
378   %mul5.i = mul nsw i32 %shr4.i, %shr3.i
379   %add.i = add i32 %mul.i, %sum.01077
380   %add6.i = add i32 %add.i, %mul5.i
381   %dec = add nsw i32 %k.01078, -1
382   %cmp6 = icmp eq i32 %dec, 0
383   br i1 %cmp6, label %while.end, label %while.body7
385 while.end:                                        ; preds = %while.body7
386   %2 = lshr i32 %add6.i, 15
387   %conv10 = trunc i32 %2 to i16
388   %incdec.ptr11 = getelementptr inbounds i16, i16* %pOut.01081, i32 1
389   store i16 %conv10, i16* %pOut.01081, align 2
390   %add.ptr = getelementptr inbounds i16, i16* %pSrcA.pSrcB, i32 %count.01084
391   %inc = add nuw nsw i32 %count.01084, 1
392   %dec12 = add i32 %blockSize1.01083, -1
393   %cmp3 = icmp ult i32 %count.01084, 3
394   %cmp4 = icmp ne i32 %dec12, 0
395   %3 = and i1 %cmp4, %cmp3
396   br i1 %3, label %while.cond5.preheader, label %while.end13
398 while.end13:                                      ; preds = %while.end, %entry
399   %pOut.0.lcssa = phi i16* [ %pDst, %entry ], [ %incdec.ptr11, %while.end ]
400   %py.0.lcssa = phi i16* [ %pSrcA.pSrcB, %entry ], [ %add.ptr, %while.end ]
401   %blockSize1.0.lcssa = phi i32 [ %sub, %entry ], [ %dec12, %while.end ]
402   %count.0.lcssa = phi i32 [ 1, %entry ], [ %inc, %while.end ]
403   %cmp161068 = icmp eq i32 %blockSize1.0.lcssa, 0
404   br i1 %cmp161068, label %exit, label %while.body18.preheader
406 while.body18.preheader:                           ; preds = %while.end13
407   %add.ptr14 = getelementptr inbounds i16, i16* %py.0.lcssa, i32 -1
408   br label %while.body18
410 while.body18:                                     ; preds = %while.end43, %while.body18.preheader
411   %count.11072 = phi i32 [ %inc49, %while.end43 ], [ %count.0.lcssa, %while.body18.preheader ]
412   %blockSize1.11071 = phi i32 [ %dec50, %while.end43 ], [ %blockSize1.0.lcssa, %while.body18.preheader ]
413   %py.21070 = phi i16* [ %add.ptr48, %while.end43 ], [ %add.ptr14, %while.body18.preheader ]
414   %pOut.11069 = phi i16* [ %incdec.ptr46, %while.end43 ], [ %pOut.0.lcssa, %while.body18.preheader ]
415   %shr19 = lshr i32 %count.11072, 2
416   %cmp211054 = icmp eq i32 %shr19, 0
417   br i1 %cmp211054, label %while.end31, label %while.body23
419 while.body23:                                     ; preds = %while.body23, %while.body18
420   %k.11058 = phi i32 [ %dec30, %while.body23 ], [ %shr19, %while.body18 ]
421   %sum.11057 = phi i32 [ %add6.i878, %while.body23 ], [ 0, %while.body18 ]
422   %py.31056 = phi i16* [ %add.ptr.i884, %while.body23 ], [ %py.21070, %while.body18 ]
423   %px.31055 = phi i16* [ %add.ptr.i890, %while.body23 ], [ %pSrcB.pSrcA, %while.body18 ]
424   %arrayidx.i907 = getelementptr inbounds i16, i16* %px.31055, i32 1
425   %4 = load i16, i16* %arrayidx.i907, align 2
426   %5 = load i16, i16* %px.31055, align 2
427   %add.ptr.i912 = getelementptr inbounds i16, i16* %px.31055, i32 2
428   %arrayidx.i901 = getelementptr inbounds i16, i16* %py.31056, i32 1
429   %6 = load i16, i16* %arrayidx.i901, align 2
430   %7 = load i16, i16* %py.31056, align 2
431   %add.ptr.i906 = getelementptr inbounds i16, i16* %py.31056, i32 -2
432   %shr.i892 = sext i16 %5 to i32
433   %shr1.i893 = sext i16 %6 to i32
434   %mul.i894 = mul nsw i32 %shr1.i893, %shr.i892
435   %shr2.i895 = sext i16 %4 to i32
436   %shr4.i897 = sext i16 %7 to i32
437   %mul5.i898 = mul nsw i32 %shr4.i897, %shr2.i895
438   %add.i899 = add i32 %mul.i894, %sum.11057
439   %add6.i900 = add i32 %add.i899, %mul5.i898
440   %arrayidx.i885 = getelementptr inbounds i16, i16* %px.31055, i32 3
441   %8 = load i16, i16* %arrayidx.i885, align 2
442   %9 = load i16, i16* %add.ptr.i912, align 2
443   %add.ptr.i890 = getelementptr inbounds i16, i16* %px.31055, i32 4
444   %arrayidx.i879 = getelementptr inbounds i16, i16* %py.31056, i32 -1
445   %10 = load i16, i16* %arrayidx.i879, align 2
446   %11 = load i16, i16* %add.ptr.i906, align 2
447   %add.ptr.i884 = getelementptr inbounds i16, i16* %py.31056, i32 -4
448   %shr.i870 = sext i16 %9 to i32
449   %shr1.i871 = sext i16 %10 to i32
450   %mul.i872 = mul nsw i32 %shr1.i871, %shr.i870
451   %shr2.i873 = sext i16 %8 to i32
452   %shr4.i875 = sext i16 %11 to i32
453   %mul5.i876 = mul nsw i32 %shr4.i875, %shr2.i873
454   %add.i877 = add i32 %add6.i900, %mul.i872
455   %add6.i878 = add i32 %add.i877, %mul5.i876
456   %dec30 = add nsw i32 %k.11058, -1
457   %cmp21 = icmp eq i32 %dec30, 0
458   br i1 %cmp21, label %while.end31, label %while.body23
460 while.end31:                                      ; preds = %while.body23, %while.body18
461   %px.3.lcssa = phi i16* [ %pSrcB.pSrcA, %while.body18 ], [ %add.ptr.i890, %while.body23 ]
462   %py.3.lcssa = phi i16* [ %py.21070, %while.body18 ], [ %add.ptr.i884, %while.body23 ]
463   %sum.1.lcssa = phi i32 [ 0, %while.body18 ], [ %add6.i878, %while.body23 ]
464   %rem = and i32 %count.11072, 3
465   %cmp341062 = icmp eq i32 %rem, 0
466   br i1 %cmp341062, label %while.end43, label %while.body36.preheader
468 while.body36.preheader:                           ; preds = %while.end31
469   %add.ptr32 = getelementptr inbounds i16, i16* %py.3.lcssa, i32 1
470   br label %while.body36
472 while.body36:                                     ; preds = %while.body36, %while.body36.preheader
473   %k.21066 = phi i32 [ %dec42, %while.body36 ], [ %rem, %while.body36.preheader ]
474   %sum.21065 = phi i32 [ %add6.i868, %while.body36 ], [ %sum.1.lcssa, %while.body36.preheader ]
475   %py.41064 = phi i16* [ %incdec.ptr39, %while.body36 ], [ %add.ptr32, %while.body36.preheader ]
476   %px.41063 = phi i16* [ %incdec.ptr37, %while.body36 ], [ %px.3.lcssa, %while.body36.preheader ]
477   %incdec.ptr37 = getelementptr inbounds i16, i16* %px.41063, i32 1
478   %12 = load i16, i16* %px.41063, align 2
479   %conv38 = sext i16 %12 to i32
480   %incdec.ptr39 = getelementptr inbounds i16, i16* %py.41064, i32 -1
481   %13 = load i16, i16* %py.41064, align 2
482   %conv40 = sext i16 %13 to i32
483   %mul.i863 = mul nsw i32 %conv40, %conv38
484   %shr3.i864 = ashr i32 %conv38, 16
485   %shr4.i865 = ashr i32 %conv40, 16
486   %mul5.i866 = mul nsw i32 %shr4.i865, %shr3.i864
487   %add.i867 = add i32 %mul.i863, %sum.21065
488   %add6.i868 = add i32 %add.i867, %mul5.i866
489   %dec42 = add nsw i32 %k.21066, -1
490   %cmp34 = icmp eq i32 %dec42, 0
491   br i1 %cmp34, label %while.end43, label %while.body36
493 while.end43:                                      ; preds = %while.body36, %while.end31
494   %sum.2.lcssa = phi i32 [ %sum.1.lcssa, %while.end31 ], [ %add6.i868, %while.body36 ]
495   %14 = lshr i32 %sum.2.lcssa, 15
496   %conv45 = trunc i32 %14 to i16
497   %incdec.ptr46 = getelementptr inbounds i16, i16* %pOut.11069, i32 1
498   store i16 %conv45, i16* %pOut.11069, align 2
499   %sub47 = add i32 %count.11072, -1
500   %add.ptr48 = getelementptr inbounds i16, i16* %pSrcA.pSrcB, i32 %sub47
501   %inc49 = add i32 %count.11072, 1
502   %dec50 = add i32 %blockSize1.11071, -1
503   %cmp16 = icmp eq i32 %dec50, 0
504   br i1 %cmp16, label %exit, label %while.body18
506 exit:                                             ; preds = %while.end43, %while.end13
507   ret void