Skip to content

Commit c61fb46

Browse files
committed
!fixup add extra test, remove stray whitespace, thanks
1 parent 12e674c commit c61fb46

File tree

2 files changed

+122
-1
lines changed

2 files changed

+122
-1
lines changed

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4295,7 +4295,7 @@ canSinkStoreWithNoAliasCheck(ArrayRef<VPReplicateRecipe *> StoresToSink) {
42954295
return false;
42964296

42974297
// When sinking a group of stores, all members of the group alias each other.
4298-
// Skip them during the alias checks.
4298+
// Skip them during the alias checks.
42994299
SmallPtrSet<VPRecipeBase *, 4> StoresToSinkSet(StoresToSink.begin(),
43004300
StoresToSink.end());
43014301

llvm/test/Transforms/LoopVectorize/hoist-predicated-loads-with-predicated-stores.ll

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,3 +966,124 @@ loop.latch:
966966
exit:
967967
ret void
968968
}
969+
970+
; Test with 3 predicated stores to the same address, but with different
971+
; (non-complementary) predicates.
972+
define void @test_three_stores_with_different_predicates(ptr %dst, ptr %src, ptr %cond) {
973+
; CHECK-LABEL: define void @test_three_stores_with_different_predicates(
974+
; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]], ptr [[COND:%.*]]) {
975+
; CHECK-NEXT: [[ENTRY:.*:]]
976+
; CHECK-NEXT: br label %[[VECTOR_MEMCHECK:.*]]
977+
; CHECK: [[VECTOR_MEMCHECK]]:
978+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DST]], i64 400
979+
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[COND]], i64 400
980+
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP1]]
981+
; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[COND]], [[SCEVGEP]]
982+
; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
983+
; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
984+
; CHECK: [[VECTOR_PH]]:
985+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
986+
; CHECK: [[VECTOR_BODY]]:
987+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE11:.*]] ]
988+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 0
989+
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[INDEX]], 1
990+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[COND]], i32 [[TMP0]]
991+
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4, !alias.scope [[META85:![0-9]+]]
992+
; CHECK-NEXT: [[TMP3:%.*]] = icmp ule <2 x i32> [[WIDE_LOAD]], splat (i32 11)
993+
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i1> [[TMP3]], i32 0
994+
; CHECK-NEXT: br i1 [[TMP4]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
995+
; CHECK: [[PRED_STORE_IF]]:
996+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP0]]
997+
; CHECK-NEXT: store i32 1, ptr [[TMP5]], align 4, !alias.scope [[META88:![0-9]+]], !noalias [[META85]]
998+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
999+
; CHECK: [[PRED_STORE_CONTINUE]]:
1000+
; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i1> [[TMP3]], i32 1
1001+
; CHECK-NEXT: br i1 [[TMP6]], label %[[PRED_STORE_IF2:.*]], label %[[PRED_STORE_CONTINUE3:.*]]
1002+
; CHECK: [[PRED_STORE_IF2]]:
1003+
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP1]]
1004+
; CHECK-NEXT: store i32 1, ptr [[TMP7]], align 4, !alias.scope [[META88]], !noalias [[META85]]
1005+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE3]]
1006+
; CHECK: [[PRED_STORE_CONTINUE3]]:
1007+
; CHECK-NEXT: [[TMP8:%.*]] = xor <2 x i1> [[TMP3]], splat (i1 true)
1008+
; CHECK-NEXT: [[TMP9:%.*]] = or <2 x i1> [[TMP3]], [[TMP8]]
1009+
; CHECK-NEXT: [[TMP10:%.*]] = icmp ule <2 x i32> [[WIDE_LOAD]], splat (i32 10)
1010+
; CHECK-NEXT: [[TMP11:%.*]] = select <2 x i1> [[TMP9]], <2 x i1> [[TMP10]], <2 x i1> zeroinitializer
1011+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x i1> [[TMP11]], i32 0
1012+
; CHECK-NEXT: br i1 [[TMP12]], label %[[PRED_STORE_IF4:.*]], label %[[PRED_STORE_CONTINUE5:.*]]
1013+
; CHECK: [[PRED_STORE_IF4]]:
1014+
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP0]]
1015+
; CHECK-NEXT: store i32 2, ptr [[TMP13]], align 4, !alias.scope [[META88]], !noalias [[META85]]
1016+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE5]]
1017+
; CHECK: [[PRED_STORE_CONTINUE5]]:
1018+
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <2 x i1> [[TMP11]], i32 1
1019+
; CHECK-NEXT: br i1 [[TMP14]], label %[[PRED_STORE_IF6:.*]], label %[[PRED_STORE_CONTINUE7:.*]]
1020+
; CHECK: [[PRED_STORE_IF6]]:
1021+
; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP1]]
1022+
; CHECK-NEXT: store i32 2, ptr [[TMP15]], align 4, !alias.scope [[META88]], !noalias [[META85]]
1023+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE7]]
1024+
; CHECK: [[PRED_STORE_CONTINUE7]]:
1025+
; CHECK-NEXT: [[TMP16:%.*]] = icmp ule <2 x i32> [[WIDE_LOAD]], splat (i32 9)
1026+
; CHECK-NEXT: [[TMP17:%.*]] = select <2 x i1> [[TMP9]], <2 x i1> [[TMP16]], <2 x i1> zeroinitializer
1027+
; CHECK-NEXT: [[TMP18:%.*]] = extractelement <2 x i1> [[TMP17]], i32 0
1028+
; CHECK-NEXT: br i1 [[TMP18]], label %[[PRED_STORE_IF8:.*]], label %[[PRED_STORE_CONTINUE9:.*]]
1029+
; CHECK: [[PRED_STORE_IF8]]:
1030+
; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP0]]
1031+
; CHECK-NEXT: store i32 3, ptr [[TMP19]], align 4, !alias.scope [[META88]], !noalias [[META85]]
1032+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE9]]
1033+
; CHECK: [[PRED_STORE_CONTINUE9]]:
1034+
; CHECK-NEXT: [[TMP20:%.*]] = extractelement <2 x i1> [[TMP17]], i32 1
1035+
; CHECK-NEXT: br i1 [[TMP20]], label %[[PRED_STORE_IF10:.*]], label %[[PRED_STORE_CONTINUE11]]
1036+
; CHECK: [[PRED_STORE_IF10]]:
1037+
; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP1]]
1038+
; CHECK-NEXT: store i32 3, ptr [[TMP21]], align 4, !alias.scope [[META88]], !noalias [[META85]]
1039+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE11]]
1040+
; CHECK: [[PRED_STORE_CONTINUE11]]:
1041+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1042+
; CHECK-NEXT: [[TMP22:%.*]] = icmp eq i32 [[INDEX_NEXT]], 100
1043+
; CHECK-NEXT: br i1 [[TMP22]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP90:![0-9]+]]
1044+
; CHECK: [[MIDDLE_BLOCK]]:
1045+
; CHECK-NEXT: br [[EXIT:label %.*]]
1046+
; CHECK: [[SCALAR_PH]]:
1047+
;
1048+
entry:
1049+
br label %loop
1050+
1051+
loop:
1052+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
1053+
%gep.cond = getelementptr inbounds i32, ptr %cond, i32 %iv
1054+
%c = load i32, ptr %gep.cond, align 4
1055+
%c.0 = icmp ule i32 %c, 11
1056+
br i1 %c.0, label %then.0, label %continue.0
1057+
1058+
then.0:
1059+
%gep.dst.then.0 = getelementptr inbounds i32, ptr %dst, i32 %iv
1060+
store i32 1, ptr %gep.dst.then.0, align 4
1061+
br label %continue.0
1062+
1063+
continue.0:
1064+
%c.1 = icmp ule i32 %c, 10
1065+
br i1 %c.1, label %then.1, label %continue.1
1066+
1067+
then.1:
1068+
%gep.dst.then.1 = getelementptr inbounds i32, ptr %dst, i32 %iv
1069+
store i32 2, ptr %gep.dst.then.1, align 4
1070+
br label %continue.1
1071+
1072+
continue.1:
1073+
%c.2 = icmp ule i32 %c, 9
1074+
br i1 %c.2, label %then.2, label %loop.latch
1075+
1076+
then.2:
1077+
%gep.dst.then.2 = getelementptr inbounds i32, ptr %dst, i32 %iv
1078+
store i32 3, ptr %gep.dst.then.2, align 4
1079+
br label %loop.latch
1080+
1081+
loop.latch:
1082+
%iv.next = add nuw nsw i32 %iv, 1
1083+
%ec = icmp eq i32 %iv.next, 100
1084+
br i1 %ec, label %exit, label %loop
1085+
1086+
exit:
1087+
ret void
1088+
}
1089+

0 commit comments

Comments
 (0)