@@ -101,6 +101,127 @@ define i32 @loadCombine_4consecutive(ptr %p) {
101101 ret i32 %o3
102102}
103103
104+ define i32 @loadCombine_4consecutive_commuted (ptr %p ) {
105+ ; LE-LABEL: @loadCombine_4consecutive_commuted(
106+ ; LE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
107+ ; LE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
108+ ; LE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1
109+ ; LE-NEXT: [[L2:%.*]] = load i16, ptr [[P1]], align 1
110+ ; LE-NEXT: [[TMP1:%.*]] = zext i16 [[L2]] to i32
111+ ; LE-NEXT: [[TMP2:%.*]] = shl i32 [[TMP1]], 8
112+ ; LE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1
113+ ; LE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
114+ ; LE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32
115+ ; LE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24
116+ ; LE-NEXT: [[O2:%.*]] = or i32 [[S4]], [[TMP2]]
117+ ; LE-NEXT: [[O3:%.*]] = or i32 [[E1]], [[O2]]
118+ ; LE-NEXT: ret i32 [[O3]]
119+ ;
120+ ; BE-LABEL: @loadCombine_4consecutive_commuted(
121+ ; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
122+ ; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2
123+ ; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
124+ ; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1
125+ ; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1
126+ ; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1
127+ ; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1
128+ ; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
129+ ; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
130+ ; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
131+ ; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32
132+ ; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8
133+ ; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16
134+ ; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24
135+ ; BE-NEXT: [[O1:%.*]] = or i32 [[S2]], [[S3]]
136+ ; BE-NEXT: [[O2:%.*]] = or i32 [[S4]], [[O1]]
137+ ; BE-NEXT: [[O3:%.*]] = or i32 [[E1]], [[O2]]
138+ ; BE-NEXT: ret i32 [[O3]]
139+ ;
140+ %p1 = getelementptr i8 , ptr %p , i32 1
141+ %p2 = getelementptr i8 , ptr %p , i32 2
142+ %p3 = getelementptr i8 , ptr %p , i32 3
143+ %l1 = load i8 , ptr %p
144+ %l2 = load i8 , ptr %p1
145+ %l3 = load i8 , ptr %p2
146+ %l4 = load i8 , ptr %p3
147+
148+ %e1 = zext i8 %l1 to i32
149+ %e2 = zext i8 %l2 to i32
150+ %e3 = zext i8 %l3 to i32
151+ %e4 = zext i8 %l4 to i32
152+
153+ %s2 = shl i32 %e2 , 8
154+ %s3 = shl i32 %e3 , 16
155+ %s4 = shl i32 %e4 , 24
156+
157+ %o1 = or i32 %s2 , %s3
158+ %o2 = or i32 %s4 , %o1
159+ %o3 = or i32 %e1 , %o2
160+ ret i32 %o3
161+ }
162+
163+ define i32 @loadCombine_4consecutive_multiuse (ptr %p ) {
164+ ; LE-LABEL: @loadCombine_4consecutive_multiuse(
165+ ; LE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2
166+ ; LE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
167+ ; LE-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 1
168+ ; LE-NEXT: [[TMP1:%.*]] = zext i16 [[L1]] to i32
169+ ; LE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1
170+ ; LE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1
171+ ; LE-NEXT: call void @use(i8 [[L4]])
172+ ; LE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
173+ ; LE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32
174+ ; LE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16
175+ ; LE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24
176+ ; LE-NEXT: [[O2:%.*]] = or i32 [[TMP1]], [[S3]]
177+ ; LE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]
178+ ; LE-NEXT: ret i32 [[O3]]
179+ ;
180+ ; BE-LABEL: @loadCombine_4consecutive_multiuse(
181+ ; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
182+ ; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2
183+ ; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
184+ ; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1
185+ ; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1
186+ ; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1
187+ ; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1
188+ ; BE-NEXT: call void @use(i8 [[L4]])
189+ ; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
190+ ; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
191+ ; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
192+ ; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32
193+ ; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8
194+ ; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16
195+ ; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24
196+ ; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]
197+ ; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]
198+ ; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]
199+ ; BE-NEXT: ret i32 [[O3]]
200+ ;
201+ %p1 = getelementptr i8 , ptr %p , i32 1
202+ %p2 = getelementptr i8 , ptr %p , i32 2
203+ %p3 = getelementptr i8 , ptr %p , i32 3
204+ %l1 = load i8 , ptr %p
205+ %l2 = load i8 , ptr %p1
206+ %l3 = load i8 , ptr %p2
207+ %l4 = load i8 , ptr %p3
208+ call void @use (i8 %l4 )
209+
210+ %e1 = zext i8 %l1 to i32
211+ %e2 = zext i8 %l2 to i32
212+ %e3 = zext i8 %l3 to i32
213+ %e4 = zext i8 %l4 to i32
214+
215+ %s2 = shl i32 %e2 , 8
216+ %s3 = shl i32 %e3 , 16
217+ %s4 = shl i32 %e4 , 24
218+
219+ %o1 = or i32 %e1 , %s2
220+ %o2 = or i32 %o1 , %s3
221+ %o3 = or i32 %o2 , %s4
222+ ret i32 %o3
223+ }
224+
104225define i32 @loadCombine_4consecutive_BE (ptr %p ) {
105226; LE-LABEL: @loadCombine_4consecutive_BE(
106227; LE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
0 commit comments