@@ -381,3 +381,42 @@ loop:
381
381
exit:
382
382
ret void
383
383
}
384
+
385
+ define void @hoist_previous_value_and_operands (ptr %dst , i64 %mask ) {
386
+ ; CHECK-LABEL: @hoist_previous_value_and_operands(
387
+ ; CHECK-NEXT: bb:
388
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
389
+ ; CHECK: loop:
390
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[ADD:%.*]], [[LOOP]] ], [ 1, [[BB:%.*]] ]
391
+ ; CHECK-NEXT: [[FOR_1:%.*]] = phi i32 [ [[TRUNC:%.*]], [[LOOP]] ], [ 1, [[BB]] ]
392
+ ; CHECK-NEXT: [[FOR_2:%.*]] = phi i32 [ [[OR:%.*]], [[LOOP]] ], [ 0, [[BB]] ]
393
+ ; CHECK-NEXT: [[OR]] = or i32 [[FOR_1]], 0
394
+ ; CHECK-NEXT: [[ADD]] = add i64 [[IV]], 1
395
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[IV]]
396
+ ; CHECK-NEXT: store i32 [[FOR_2]], ptr [[GEP]], align 4
397
+ ; CHECK-NEXT: [[ICMP:%.*]] = icmp ult i64 [[IV]], 337
398
+ ; CHECK-NEXT: [[A:%.*]] = and i64 [[IV]], [[MASK:%.*]]
399
+ ; CHECK-NEXT: [[TRUNC]] = trunc i64 [[A]] to i32
400
+ ; CHECK-NEXT: br i1 [[ICMP]], label [[LOOP]], label [[EXIT:%.*]]
401
+ ; CHECK: exit:
402
+ ; CHECK-NEXT: ret void
403
+ ;
404
+ bb:
405
+ br label %loop
406
+
407
+ loop:
408
+ %iv = phi i64 [ %add , %loop ], [ 1 , %bb ]
409
+ %for.1 = phi i32 [ %trunc , %loop ], [ 1 , %bb ]
410
+ %for.2 = phi i32 [ %or , %loop ], [ 0 , %bb ]
411
+ %or = or i32 %for.1 , 0
412
+ %add = add i64 %iv , 1
413
+ %gep = getelementptr inbounds i32 , ptr %dst , i64 %iv
414
+ store i32 %for.2 , ptr %gep , align 4
415
+ %icmp = icmp ult i64 %iv , 337
416
+ %a = and i64 %iv , %mask
417
+ %trunc = trunc i64 %a to i32
418
+ br i1 %icmp , label %loop , label %exit
419
+
420
+ exit:
421
+ ret void
422
+ }
0 commit comments