@@ -966,3 +966,124 @@ loop.latch:
966966exit:
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