Skip to content

Commit 623227f

Browse files
committed
[LV] cannotHoistOrSinkRecipe pre-commit test
1 parent 67de710 commit 623227f

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

llvm/test/Transforms/LoopVectorize/first-order-recurrence-multiply-recurrences.ll

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,3 +425,102 @@ loop:
425425
exit:
426426
ret void
427427
}
428+
429+
define void @hoist_previous_value_and_operand_load(ptr %dst) {
430+
; CHECK-LABEL: @hoist_previous_value_and_operand_load(
431+
; CHECK-NEXT: entry:
432+
; CHECK-NEXT: br label [[VECTOR_PH:%.*]]
433+
; CHECK: vector.ph:
434+
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
435+
; CHECK: vector.body:
436+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
437+
; CHECK-NEXT: [[VECTOR_RECUR:%.*]] = phi <4 x i32> [ <i32 poison, i32 poison, i32 poison, i32 1>, [[VECTOR_PH]] ], [ [[BROADCAST_SPLAT:%.*]], [[VECTOR_BODY]] ]
438+
; CHECK-NEXT: [[VECTOR_RECUR1:%.*]] = phi <4 x i32> [ <i32 poison, i32 poison, i32 poison, i32 0>, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ]
439+
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 1, [[INDEX]]
440+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[OFFSET_IDX]]
441+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[DST]], align 4
442+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i64 0
443+
; CHECK-NEXT: [[BROADCAST_SPLAT]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
444+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[VECTOR_RECUR]], <4 x i32> [[BROADCAST_SPLAT]], <4 x i32> <i32 3, i32 4, i32 5, i32 6>
445+
; CHECK-NEXT: [[TMP3]] = or <4 x i32> [[TMP2]], splat (i32 3)
446+
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <4 x i32> [[VECTOR_RECUR1]], <4 x i32> [[TMP3]], <4 x i32> <i32 3, i32 4, i32 5, i32 6>
447+
; CHECK-NEXT: store <4 x i32> [[TMP4]], ptr [[TMP0]], align 4
448+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
449+
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 336
450+
; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
451+
; CHECK: middle.block:
452+
; CHECK-NEXT: [[VECTOR_RECUR_EXTRACT:%.*]] = extractelement <4 x i32> [[TMP3]], i32 3
453+
; CHECK-NEXT: br label [[SCALAR_PH:%.*]]
454+
; CHECK: scalar.ph:
455+
; CHECK-NEXT: br label [[LOOP:%.*]]
456+
; CHECK: loop:
457+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 337, [[SCALAR_PH]] ], [ [[ADD:%.*]], [[LOOP]] ]
458+
; CHECK-NEXT: [[FOR_1:%.*]] = phi i32 [ [[TMP1]], [[SCALAR_PH]] ], [ [[LOAD:%.*]], [[LOOP]] ]
459+
; CHECK-NEXT: [[FOR_2:%.*]] = phi i32 [ [[VECTOR_RECUR_EXTRACT]], [[SCALAR_PH]] ], [ [[OR:%.*]], [[LOOP]] ]
460+
; CHECK-NEXT: [[OR]] = or i32 [[FOR_1]], 3
461+
; CHECK-NEXT: [[ADD]] = add i64 [[IV]], 1
462+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[IV]]
463+
; CHECK-NEXT: store i32 [[FOR_2]], ptr [[GEP]], align 4
464+
; CHECK-NEXT: [[ICMP:%.*]] = icmp ult i64 [[IV]], 337
465+
; CHECK-NEXT: [[LOAD]] = load i32, ptr [[DST]], align 4
466+
; CHECK-NEXT: br i1 [[ICMP]], label [[LOOP]], label [[EXIT:%.*]], !llvm.loop [[LOOP8:![0-9]+]]
467+
; CHECK: exit:
468+
; CHECK-NEXT: ret void
469+
;
470+
entry:
471+
br label %loop
472+
473+
loop:
474+
%iv = phi i64 [ 1, %entry ], [ %add, %loop ]
475+
%for.1 = phi i32 [ 1, %entry ], [ %load, %loop ]
476+
%for.2 = phi i32 [ 0, %entry ], [ %or, %loop ]
477+
%or = or i32 %for.1, 3
478+
%add = add i64 %iv, 1
479+
%gep = getelementptr inbounds i32, ptr %dst, i64 %iv
480+
store i32 %for.2, ptr %gep
481+
%icmp = icmp ult i64 %iv, 337
482+
%load = load i32, ptr %dst
483+
br i1 %icmp, label %loop, label %exit
484+
485+
exit:
486+
ret void
487+
}
488+
489+
define void @hoist_previous_value_and_operand_assume(ptr %dst) {
490+
; CHECK-LABEL: @hoist_previous_value_and_operand_assume(
491+
; CHECK-NEXT: entry:
492+
; CHECK-NEXT: br label [[LOOP:%.*]]
493+
; CHECK: loop:
494+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 1, [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[LOOP]] ]
495+
; CHECK-NEXT: [[FOR_1:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[TRUNC:%.*]], [[LOOP]] ]
496+
; CHECK-NEXT: [[FOR_2:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[OR:%.*]], [[LOOP]] ]
497+
; CHECK-NEXT: [[OR]] = or i1 [[FOR_1]], true
498+
; CHECK-NEXT: [[ADD]] = add i64 [[IV]], 1
499+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[IV]]
500+
; CHECK-NEXT: store i1 [[FOR_2]], ptr [[GEP]], align 1
501+
; CHECK-NEXT: [[ICMP:%.*]] = icmp ult i64 [[IV]], 337
502+
; CHECK-NEXT: call void @llvm.assume(i1 [[FOR_1]])
503+
; CHECK-NEXT: [[TRUNC]] = trunc i64 [[IV]] to i1
504+
; CHECK-NEXT: br i1 [[ICMP]], label [[LOOP]], label [[EXIT:%.*]]
505+
; CHECK: exit:
506+
; CHECK-NEXT: ret void
507+
;
508+
entry:
509+
br label %loop
510+
511+
loop:
512+
%iv = phi i64 [ 1, %entry ], [ %add, %loop ]
513+
%for.1 = phi i1 [ 1, %entry ], [ %trunc, %loop ]
514+
%for.2 = phi i1 [ 0, %entry ], [ %or, %loop ]
515+
%or = or i1 %for.1, 3
516+
%add = add i64 %iv, 1
517+
%gep = getelementptr inbounds i32, ptr %dst, i64 %iv
518+
store i1 %for.2, ptr %gep
519+
%icmp = icmp ult i64 %iv, 337
520+
call void @llvm.assume(i1 %for.1)
521+
%trunc = trunc i64 %iv to i1
522+
br i1 %icmp, label %loop, label %exit
523+
524+
exit:
525+
ret void
526+
}

0 commit comments

Comments
 (0)