@@ -1117,28 +1117,40 @@ TEST_F(ScalarEvolutionsTest, SCEVComputeConstantDifference) {
1117
1117
LLVMContext C;
1118
1118
SMDiagnostic Err;
1119
1119
std::unique_ptr<Module> M = parseAssemblyString (
1120
- " define void @foo(i32 %sz, i32 %pp, i32 %x) { "
1121
- " entry: "
1122
- " %v0 = add i32 %pp, 0 "
1123
- " %v3 = add i32 %pp, 3 "
1124
- " %vx = add i32 %pp, %x "
1125
- " %vx3 = add i32 %vx, 3 "
1126
- " br label %loop.body "
1127
- " loop.body: "
1128
- " %iv = phi i32 [ %iv.next, %loop.body ], [ 0, %entry ] "
1129
- " %xa = add nsw i32 %iv, %v0 "
1130
- " %yy = add nsw i32 %iv, %v3 "
1131
- " %xb = sub nsw i32 %yy, 3 "
1132
- " %iv.next = add nsw i32 %iv, 1 "
1133
- " %cmp = icmp sle i32 %iv.next, %sz "
1134
- " br i1 %cmp, label %loop.body, label %exit "
1135
- " exit: "
1136
- " ret void "
1137
- " } " ,
1120
+ R"( define void @foo(ptr %ptr, i32 %sz, i32 %pp, i32 %x) {
1121
+ entry:
1122
+ %v0 = add i32 %pp, 0
1123
+ %v3 = add i32 %pp, 3
1124
+ %vx = add i32 %pp, %x
1125
+ %vx3 = add i32 %vx, 3
1126
+ br label %loop.body
1127
+ loop.body:
1128
+ %iv = phi i32 [ %iv.next, %loop.body ], [ 0, %entry ]
1129
+ %xa = add nsw i32 %iv, %v0
1130
+ %yy = add nsw i32 %iv, %v3
1131
+ %xb = sub nsw i32 %yy, 3
1132
+ %iv.next = add nsw i32 %iv, 1
1133
+ %cmp = icmp sle i32 %iv.next, %sz
1134
+ br i1 %cmp, label %loop.body, label %loop2.body
1135
+ loop2.body:
1136
+ %iv2 = phi i32 [ %iv2.next, %loop2.body ], [ %iv, %loop.body ]
1137
+ %iv2.next = add nsw i32 %iv2, 1
1138
+ %iv2p3 = add i32 %iv2, 3
1139
+ %var = load i32, ptr %ptr
1140
+ %iv2pvar = add i32 %iv2, %var
1141
+ %iv2pvarp3 = add i32 %iv2pvar, 3
1142
+ %cmp2 = icmp sle i32 %iv2.next, %sz
1143
+ br i1 %cmp2, label %loop2.body, label %exit
1144
+ exit:
1145
+ ret void
1146
+ })" ,
1138
1147
Err, C);
1139
1148
1140
- ASSERT_TRUE (M && " Could not parse module?" );
1141
- ASSERT_TRUE (!verifyModule (*M) && " Must have been well formed!" );
1149
+ if (!M) {
1150
+ Err.print (" ScalarEvolutionTest" , errs ());
1151
+ ASSERT_TRUE (M && " Could not parse module?" );
1152
+ }
1153
+ ASSERT_TRUE (!verifyModule (*M, &errs ()) && " Must have been well formed!" );
1142
1154
1143
1155
runWithSE (*M, " foo" , [](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
1144
1156
const SCEV *ScevV0 = SE.getSCEV (getInstructionByName (F, " v0" )); // %pp
@@ -1154,6 +1166,15 @@ TEST_F(ScalarEvolutionsTest, SCEVComputeConstantDifference) {
1154
1166
const SCEV *ScevXB = SE.getSCEV (getInstructionByName (F, " xb" )); // {%pp,+,1}
1155
1167
const SCEV *ScevIVNext =
1156
1168
SE.getSCEV (getInstructionByName (F, " iv.next" )); // {1,+,1}
1169
+ // {{0,+,1},+,1}
1170
+ const SCEV *ScevIV2 = SE.getSCEV (getInstructionByName (F, " iv2" ));
1171
+ // {{3,+,1},+,1}
1172
+ const SCEV *ScevIV2P3 = SE.getSCEV (getInstructionByName (F, " iv2p3" ));
1173
+ // %var + {{0,+,1},+,1}
1174
+ const SCEV *ScevIV2PVar = SE.getSCEV (getInstructionByName (F, " iv2pvar" ));
1175
+ // %var + {{3,+,1},+,1}
1176
+ const SCEV *ScevIV2PVarP3 =
1177
+ SE.getSCEV (getInstructionByName (F, " iv2pvarp3" ));
1157
1178
1158
1179
auto diff = [&SE](const SCEV *LHS, const SCEV *RHS) -> std::optional<int > {
1159
1180
auto ConstantDiffOrNone = computeConstantDifference (SE, LHS, RHS);
@@ -1178,6 +1199,8 @@ TEST_F(ScalarEvolutionsTest, SCEVComputeConstantDifference) {
1178
1199
EXPECT_EQ (diff (ScevIV, ScevIVNext), -1 );
1179
1200
EXPECT_EQ (diff (ScevIVNext, ScevIV), 1 );
1180
1201
EXPECT_EQ (diff (ScevIVNext, ScevIVNext), 0 );
1202
+ EXPECT_EQ (diff (ScevIV2P3, ScevIV2), std::nullopt); // TODO
1203
+ EXPECT_EQ (diff (ScevIV2PVar, ScevIV2PVarP3), std::nullopt); // TODO
1181
1204
EXPECT_EQ (diff (ScevV0, ScevIV), std::nullopt);
1182
1205
EXPECT_EQ (diff (ScevIVNext, ScevV3), std::nullopt);
1183
1206
EXPECT_EQ (diff (ScevYY, ScevV3), std::nullopt);
0 commit comments