@@ -979,3 +979,198 @@ loop:
979
979
exit:
980
980
ret float %add
981
981
}
982
+
983
+ ; Test case for https://github.com/llvm/llvm-project/issues/121745.
984
+ ; FIXME: At the moment an incorrect exit value is used for %iv.next.
985
+ define i32 @test_iv_uniform_with_outside_use_scev_simplification (ptr %dst ) {
986
+ ; VEC-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification(
987
+ ; VEC-SAME: ptr [[DST:%.*]]) {
988
+ ; VEC-NEXT: [[ENTRY:.*]]:
989
+ ; VEC-NEXT: [[STEP_1:%.*]] = sext i8 0 to i32
990
+ ; VEC-NEXT: [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 1
991
+ ; VEC-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
992
+ ; VEC: [[VECTOR_PH]]:
993
+ ; VEC-NEXT: br label %[[VECTOR_BODY:.*]]
994
+ ; VEC: [[VECTOR_BODY]]:
995
+ ; VEC-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
996
+ ; VEC-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 0
997
+ ; VEC-NEXT: [[TMP1:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]
998
+ ; VEC-NEXT: [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[TMP1]], i32 0
999
+ ; VEC-NEXT: store <2 x i16> zeroinitializer, ptr [[TMP2]], align 2
1000
+ ; VEC-NEXT: [[TMP4:%.*]] = add i32 [[STEP_2]], [[TMP0]]
1001
+ ; VEC-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1002
+ ; VEC-NEXT: [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 8
1003
+ ; VEC-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1004
+ ; VEC: [[MIDDLE_BLOCK]]:
1005
+ ; VEC-NEXT: br i1 true, label %[[E_EXIT:.*]], label %[[SCALAR_PH]]
1006
+ ; VEC: [[SCALAR_PH]]:
1007
+ ; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 8, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1008
+ ; VEC-NEXT: br label %[[LOOP:.*]]
1009
+ ; VEC: [[LOOP]]:
1010
+ ; VEC-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1011
+ ; VEC-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[IV]]
1012
+ ; VEC-NEXT: store i16 0, ptr [[GEP_DST]], align 2
1013
+ ; VEC-NEXT: [[IV_NEXT]] = add i32 [[STEP_2]], [[IV]]
1014
+ ; VEC-NEXT: [[CMP_I:%.*]] = icmp slt i32 [[IV_NEXT]], 8
1015
+ ; VEC-NEXT: br i1 [[CMP_I]], label %[[LOOP]], label %[[E_EXIT]], {{!llvm.loop ![0-9]+}}
1016
+ ; VEC: [[E_EXIT]]:
1017
+ ; VEC-NEXT: [[RES:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP]] ], [ [[TMP4]], %[[MIDDLE_BLOCK]] ]
1018
+ ; VEC-NEXT: ret i32 [[RES]]
1019
+ ;
1020
+ ; INTERLEAVE-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification(
1021
+ ; INTERLEAVE-SAME: ptr [[DST:%.*]]) {
1022
+ ; INTERLEAVE-NEXT: [[ENTRY:.*]]:
1023
+ ; INTERLEAVE-NEXT: [[STEP_1:%.*]] = sext i8 0 to i32
1024
+ ; INTERLEAVE-NEXT: [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 1
1025
+ ; INTERLEAVE-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1026
+ ; INTERLEAVE: [[VECTOR_PH]]:
1027
+ ; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]
1028
+ ; INTERLEAVE: [[VECTOR_BODY]]:
1029
+ ; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1030
+ ; INTERLEAVE-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 0
1031
+ ; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i32 [[INDEX]], 1
1032
+ ; INTERLEAVE-NEXT: [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]
1033
+ ; INTERLEAVE-NEXT: [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]
1034
+ ; INTERLEAVE-NEXT: store i16 0, ptr [[TMP2]], align 2
1035
+ ; INTERLEAVE-NEXT: store i16 0, ptr [[TMP3]], align 2
1036
+ ; INTERLEAVE-NEXT: [[TMP5:%.*]] = add i32 [[STEP_2]], [[TMP1]]
1037
+ ; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1038
+ ; INTERLEAVE-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 8
1039
+ ; INTERLEAVE-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1040
+ ; INTERLEAVE: [[MIDDLE_BLOCK]]:
1041
+ ; INTERLEAVE-NEXT: br i1 true, label %[[E_EXIT:.*]], label %[[SCALAR_PH]]
1042
+ ; INTERLEAVE: [[SCALAR_PH]]:
1043
+ ; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 8, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1044
+ ; INTERLEAVE-NEXT: br label %[[LOOP:.*]]
1045
+ ; INTERLEAVE: [[LOOP]]:
1046
+ ; INTERLEAVE-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1047
+ ; INTERLEAVE-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[IV]]
1048
+ ; INTERLEAVE-NEXT: store i16 0, ptr [[GEP_DST]], align 2
1049
+ ; INTERLEAVE-NEXT: [[IV_NEXT]] = add i32 [[STEP_2]], [[IV]]
1050
+ ; INTERLEAVE-NEXT: [[CMP_I:%.*]] = icmp slt i32 [[IV_NEXT]], 8
1051
+ ; INTERLEAVE-NEXT: br i1 [[CMP_I]], label %[[LOOP]], label %[[E_EXIT]], {{!llvm.loop ![0-9]+}}
1052
+ ; INTERLEAVE: [[E_EXIT]]:
1053
+ ; INTERLEAVE-NEXT: [[RES:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1054
+ ; INTERLEAVE-NEXT: ret i32 [[RES]]
1055
+ ;
1056
+ entry:
1057
+ %step.1 = sext i8 0 to i32
1058
+ %step.2 = add nsw i32 %step.1 , 1
1059
+ br label %loop
1060
+
1061
+ loop:
1062
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
1063
+ %gep.dst = getelementptr inbounds i16 , ptr %dst , i32 %iv
1064
+ store i16 0 , ptr %gep.dst , align 2
1065
+ %iv.next = add i32 %step.2 , %iv
1066
+ %cmp.i = icmp slt i32 %iv.next , 8
1067
+ br i1 %cmp.i , label %loop , label %e.exit
1068
+
1069
+ e.exit:
1070
+ %res = phi i32 [ %iv.next , %loop ]
1071
+ ret i32 %res
1072
+ }
1073
+
1074
+ ; FIXME: At the moment an incorrect exit value is used for %iv.next.
1075
+ define i32 @test_iv_uniform_with_outside_use_scev_simplification_2 (ptr %dst ) {
1076
+ ; VEC-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification_2(
1077
+ ; VEC-SAME: ptr [[DST:%.*]]) {
1078
+ ; VEC-NEXT: [[ENTRY:.*]]:
1079
+ ; VEC-NEXT: [[STEP_1:%.*]] = sext i8 0 to i32
1080
+ ; VEC-NEXT: [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 1
1081
+ ; VEC-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1082
+ ; VEC: [[VECTOR_PH]]:
1083
+ ; VEC-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[STEP_2]], i64 0
1084
+ ; VEC-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i32> [[BROADCAST_SPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer
1085
+ ; VEC-NEXT: br label %[[VECTOR_BODY:.*]]
1086
+ ; VEC: [[VECTOR_BODY]]:
1087
+ ; VEC-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1088
+ ; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 2>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
1089
+ ; VEC-NEXT: [[OFFSET_IDX:%.*]] = mul i32 [[INDEX]], 2
1090
+ ; VEC-NEXT: [[TMP0:%.*]] = add i32 [[OFFSET_IDX]], 0
1091
+ ; VEC-NEXT: [[TMP1:%.*]] = add i32 [[OFFSET_IDX]], 2
1092
+ ; VEC-NEXT: [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]
1093
+ ; VEC-NEXT: [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]
1094
+ ; VEC-NEXT: store i16 0, ptr [[TMP2]], align 2
1095
+ ; VEC-NEXT: store i16 0, ptr [[TMP3]], align 2
1096
+ ; VEC-NEXT: [[TMP4:%.*]] = add <2 x i32> [[VEC_IND]], splat (i32 1)
1097
+ ; VEC-NEXT: [[TMP5:%.*]] = add <2 x i32> [[BROADCAST_SPLAT]], [[TMP4]]
1098
+ ; VEC-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1099
+ ; VEC-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], splat (i32 4)
1100
+ ; VEC-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 4
1101
+ ; VEC-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1102
+ ; VEC: [[MIDDLE_BLOCK]]:
1103
+ ; VEC-NEXT: [[TMP7:%.*]] = extractelement <2 x i32> [[TMP5]], i32 1
1104
+ ; VEC-NEXT: br i1 true, label %[[E_EXIT:.*]], label %[[SCALAR_PH]]
1105
+ ; VEC: [[SCALAR_PH]]:
1106
+ ; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 8, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1107
+ ; VEC-NEXT: br label %[[LOOP:.*]]
1108
+ ; VEC: [[LOOP]]:
1109
+ ; VEC-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1110
+ ; VEC-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[IV]]
1111
+ ; VEC-NEXT: store i16 0, ptr [[GEP_DST]], align 2
1112
+ ; VEC-NEXT: [[INC:%.*]] = add i32 [[IV]], 1
1113
+ ; VEC-NEXT: [[IV_NEXT]] = add i32 [[STEP_2]], [[INC]]
1114
+ ; VEC-NEXT: [[CMP_I:%.*]] = icmp slt i32 [[IV_NEXT]], 8
1115
+ ; VEC-NEXT: br i1 [[CMP_I]], label %[[LOOP]], label %[[E_EXIT]], {{!llvm.loop ![0-9]+}}
1116
+ ; VEC: [[E_EXIT]]:
1117
+ ; VEC-NEXT: [[RES:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP]] ], [ [[TMP7]], %[[MIDDLE_BLOCK]] ]
1118
+ ; VEC-NEXT: ret i32 [[RES]]
1119
+ ;
1120
+ ; INTERLEAVE-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification_2(
1121
+ ; INTERLEAVE-SAME: ptr [[DST:%.*]]) {
1122
+ ; INTERLEAVE-NEXT: [[ENTRY:.*]]:
1123
+ ; INTERLEAVE-NEXT: [[STEP_1:%.*]] = sext i8 0 to i32
1124
+ ; INTERLEAVE-NEXT: [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 1
1125
+ ; INTERLEAVE-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1126
+ ; INTERLEAVE: [[VECTOR_PH]]:
1127
+ ; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]
1128
+ ; INTERLEAVE: [[VECTOR_BODY]]:
1129
+ ; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1130
+ ; INTERLEAVE-NEXT: [[OFFSET_IDX:%.*]] = mul i32 [[INDEX]], 2
1131
+ ; INTERLEAVE-NEXT: [[TMP0:%.*]] = add i32 [[OFFSET_IDX]], 0
1132
+ ; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i32 [[OFFSET_IDX]], 2
1133
+ ; INTERLEAVE-NEXT: [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]
1134
+ ; INTERLEAVE-NEXT: [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]
1135
+ ; INTERLEAVE-NEXT: store i16 0, ptr [[TMP2]], align 2
1136
+ ; INTERLEAVE-NEXT: store i16 0, ptr [[TMP3]], align 2
1137
+ ; INTERLEAVE-NEXT: [[TMP4:%.*]] = add i32 [[TMP1]], 1
1138
+ ; INTERLEAVE-NEXT: [[TMP5:%.*]] = add i32 [[STEP_2]], [[TMP4]]
1139
+ ; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1140
+ ; INTERLEAVE-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 4
1141
+ ; INTERLEAVE-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1142
+ ; INTERLEAVE: [[MIDDLE_BLOCK]]:
1143
+ ; INTERLEAVE-NEXT: br i1 true, label %[[E_EXIT:.*]], label %[[SCALAR_PH]]
1144
+ ; INTERLEAVE: [[SCALAR_PH]]:
1145
+ ; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 8, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1146
+ ; INTERLEAVE-NEXT: br label %[[LOOP:.*]]
1147
+ ; INTERLEAVE: [[LOOP]]:
1148
+ ; INTERLEAVE-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1149
+ ; INTERLEAVE-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[IV]]
1150
+ ; INTERLEAVE-NEXT: store i16 0, ptr [[GEP_DST]], align 2
1151
+ ; INTERLEAVE-NEXT: [[INC:%.*]] = add i32 [[IV]], 1
1152
+ ; INTERLEAVE-NEXT: [[IV_NEXT]] = add i32 [[STEP_2]], [[INC]]
1153
+ ; INTERLEAVE-NEXT: [[CMP_I:%.*]] = icmp slt i32 [[IV_NEXT]], 8
1154
+ ; INTERLEAVE-NEXT: br i1 [[CMP_I]], label %[[LOOP]], label %[[E_EXIT]], {{!llvm.loop ![0-9]+}}
1155
+ ; INTERLEAVE: [[E_EXIT]]:
1156
+ ; INTERLEAVE-NEXT: [[RES:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1157
+ ; INTERLEAVE-NEXT: ret i32 [[RES]]
1158
+ ;
1159
+ entry:
1160
+ %step.1 = sext i8 0 to i32
1161
+ %step.2 = add nsw i32 %step.1 , 1
1162
+ br label %loop
1163
+
1164
+ loop:
1165
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
1166
+ %gep.dst = getelementptr inbounds i16 , ptr %dst , i32 %iv
1167
+ store i16 0 , ptr %gep.dst , align 2
1168
+ %inc = add i32 %iv , 1
1169
+ %iv.next = add i32 %step.2 , %inc
1170
+ %cmp.i = icmp slt i32 %iv.next , 8
1171
+ br i1 %cmp.i , label %loop , label %e.exit
1172
+
1173
+ e.exit:
1174
+ %res = phi i32 [ %iv.next , %loop ]
1175
+ ret i32 %res
1176
+ }
0 commit comments