@@ -285,6 +285,84 @@ exit:
285285 ret void
286286}
287287
288+ define void @load_op_store_loop_multiblock (ptr %src , ptr %dst , i64 %N , i64 %scale , float %k ) {
289+ ; APPLE-LABEL: define void @load_op_store_loop_multiblock(
290+ ; APPLE-SAME: ptr [[SRC:%.*]], ptr [[DST:%.*]], i64 [[N:%.*]], i64 [[SCALE:%.*]], float [[K:%.*]]) #[[ATTR0]] {
291+ ; APPLE-NEXT: [[ENTRY:.*]]:
292+ ; APPLE-NEXT: br label %[[LOOP:.*]]
293+ ; APPLE: [[LOOP]]:
294+ ; APPLE-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOPCONT:.*]] ]
295+ ; APPLE-NEXT: [[SCALED_IV:%.*]] = mul nuw nsw i64 [[IV]], [[SCALE]]
296+ ; APPLE-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds float, ptr [[SRC]], i64 [[SCALED_IV]]
297+ ; APPLE-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
298+ ; APPLE-NEXT: [[AND:%.*]] = and i64 [[IV]], 1
299+ ; APPLE-NEXT: [[ODD:%.*]] = icmp eq i64 [[AND]], 1
300+ ; APPLE-NEXT: br i1 [[ODD]], label %[[LOOPODD:.*]], label %[[LOOPCONT]]
301+ ; APPLE: [[LOOPCONT]]:
302+ ; APPLE-NEXT: [[D:%.*]] = phi float [ [[L2:%.*]], %[[LOOPODD]] ], [ [[L]], %[[LOOP]] ]
303+ ; APPLE-NEXT: [[O:%.*]] = fadd float [[D]], [[K]]
304+ ; APPLE-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds float, ptr [[DST]], i64 [[IV]]
305+ ; APPLE-NEXT: store float [[O]], ptr [[GEP_DST]], align 4
306+ ; APPLE-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
307+ ; APPLE-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
308+ ; APPLE-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
309+ ; APPLE: [[LOOPODD]]:
310+ ; APPLE-NEXT: [[L2]] = fneg float [[L]]
311+ ; APPLE-NEXT: br label %[[LOOPCONT]]
312+ ; APPLE: [[EXIT]]:
313+ ; APPLE-NEXT: ret void
314+ ;
315+ ; OTHER-LABEL: define void @load_op_store_loop_multiblock(
316+ ; OTHER-SAME: ptr [[SRC:%.*]], ptr [[DST:%.*]], i64 [[N:%.*]], i64 [[SCALE:%.*]], float [[K:%.*]]) #[[ATTR0]] {
317+ ; OTHER-NEXT: [[ENTRY:.*]]:
318+ ; OTHER-NEXT: br label %[[LOOP:.*]]
319+ ; OTHER: [[LOOP]]:
320+ ; OTHER-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOPCONT:.*]] ]
321+ ; OTHER-NEXT: [[SCALED_IV:%.*]] = mul nuw nsw i64 [[IV]], [[SCALE]]
322+ ; OTHER-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds float, ptr [[SRC]], i64 [[SCALED_IV]]
323+ ; OTHER-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
324+ ; OTHER-NEXT: [[AND:%.*]] = and i64 [[IV]], 1
325+ ; OTHER-NEXT: [[ODD:%.*]] = icmp eq i64 [[AND]], 1
326+ ; OTHER-NEXT: br i1 [[ODD]], label %[[LOOPODD:.*]], label %[[LOOPCONT]]
327+ ; OTHER: [[LOOPCONT]]:
328+ ; OTHER-NEXT: [[D:%.*]] = phi float [ [[L2:%.*]], %[[LOOPODD]] ], [ [[L]], %[[LOOP]] ]
329+ ; OTHER-NEXT: [[O:%.*]] = fadd float [[D]], [[K]]
330+ ; OTHER-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds float, ptr [[DST]], i64 [[IV]]
331+ ; OTHER-NEXT: store float [[O]], ptr [[GEP_DST]], align 4
332+ ; OTHER-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
333+ ; OTHER-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
334+ ; OTHER-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
335+ ; OTHER: [[LOOPODD]]:
336+ ; OTHER-NEXT: [[L2]] = fneg float [[L]]
337+ ; OTHER-NEXT: br label %[[LOOPCONT]]
338+ ; OTHER: [[EXIT]]:
339+ ; OTHER-NEXT: ret void
340+ ;
341+ entry:
342+ br label %loop
343+ loop:
344+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loopcont ]
345+ %scaled.iv = mul nuw nsw i64 %iv , %scale
346+ %gep.src = getelementptr inbounds float , ptr %src , i64 %scaled.iv
347+ %l1 = load float , ptr %gep.src , align 4
348+ %and = and i64 %iv , 1
349+ %odd = icmp eq i64 %and , 1
350+ br i1 %odd , label %loopodd , label %loopcont
351+ loopcont:
352+ %d = phi float [ %l2 , %loopodd ], [ %l1 , %loop ]
353+ %o = fadd float %d , %k
354+ %gep.dst = getelementptr inbounds float , ptr %dst , i64 %iv
355+ store float %o , ptr %gep.dst , align 4
356+ %iv.next = add nuw nsw i64 %iv , 1
357+ %ec = icmp eq i64 %iv.next , %N
358+ br i1 %ec , label %exit , label %loop
359+ loopodd:
360+ %l2 = fneg float %l1
361+ br label %loopcont
362+ exit:
363+ ret void
364+ }
365+
288366@A = external constant [9 x i8 ], align 1
289367@B = external constant [8 x i32 ], align 4
290368@C = external constant [8 x i32 ], align 4
0 commit comments