Skip to content

Commit 008e374

Browse files
authored
[SYCL][clang] Fix ivdep attribute in template contexts (#9924)
Several ivdep attributes without safelen argument used to fail if applied inside of a template function. That is because in this case template instantiator passes a pair of expressions to `BuildSYCLIntelIVDepAttr`, first is `nullptr` second is an array argument. Due to incorrect check the attribute was built with wrong arguments and failed correctness check later.
1 parent 745febe commit 008e374

File tree

3 files changed

+61
-6
lines changed

3 files changed

+61
-6
lines changed

clang/lib/Sema/SemaStmtAttr.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,11 @@ Sema::BuildSYCLIntelIVDepAttr(const AttributeCommonInfo &CI, Expr *Expr1,
291291
}
292292

293293
// Try to put Safelen in the 1st one so codegen can count on the ordering.
294-
Expr *SafeLenExpr;
295-
Expr *ArrayExpr;
296-
if (E1 == IVDepExprResult::SafeLen) {
297-
SafeLenExpr = Expr1;
298-
ArrayExpr = Expr2;
299-
} else {
294+
Expr *SafeLenExpr = Expr1;
295+
Expr *ArrayExpr = Expr2;
296+
297+
// Both can be null or dependent, so swap if we're really sure.
298+
if (E2 == IVDepExprResult::SafeLen || E1 == IVDepExprResult::Array) {
300299
SafeLenExpr = Expr2;
301300
ArrayExpr = Expr1;
302301
}

clang/test/CodeGenSYCL/intel-fpga-ivdep-array.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,33 @@ void ivdep_multiple_arrays() {
6161
}
6262
}
6363

64+
// CHECK: define {{.*}}spir_func void @_Z{{[0-9]+}}ivdep_multiple_arrays_templateIiEvv()
65+
template <typename T>
66+
void ivdep_multiple_arrays_template() {
67+
// CHECK: %[[ARRAY_A:[0-9a-z]+]] = alloca [10 x i32]
68+
T a[10];
69+
// CHECK: %[[ARRAY_B:[0-9a-z]+]] = alloca [10 x i32]
70+
T b[10];
71+
// CHECK: %[[ARRAY_C:[0-9a-z]+]] = alloca [10 x i32]
72+
T c[10];
73+
// CHECK: %[[ARRAY_D:[0-9a-z]+]] = alloca [10 x i32]
74+
T d[10];
75+
[[intel::ivdep(a, 5)]]
76+
[[intel::ivdep(b, 5)]]
77+
[[intel::ivdep(c)]]
78+
[[intel::ivdep(d)]] for (int i = 0; i != 10; ++i) {
79+
// CHECK: %{{[0-9a-z]+}} = getelementptr inbounds [10 x i32], ptr addrspace(4) %[[ARRAY_A]].ascast, i64 0, i64 %{{[0-9a-z]+}}, !llvm.index.group ![[IDX_GROUP_A_MUL_ARR:[0-9]+]]
80+
a[i] = 0;
81+
// CHECK: %{{[0-9a-z]+}} = getelementptr inbounds [10 x i32], ptr addrspace(4) %[[ARRAY_B]].ascast, i64 0, i64 %{{[0-9a-z]+}}, !llvm.index.group ![[IDX_GROUP_B_MUL_ARR:[0-9]+]]
82+
b[i] = 0;
83+
// CHECK: %{{[0-9a-z]+}} = getelementptr inbounds [10 x i32], ptr addrspace(4) %[[ARRAY_C]].ascast, i64 0, i64 %{{[0-9a-z]+}}, !llvm.index.group ![[IDX_GROUP_C_MUL_ARR:[0-9]+]]
84+
c[i] = 0;
85+
// CHECK: %{{[0-9a-z]+}} = getelementptr inbounds [10 x i32], ptr addrspace(4) %[[ARRAY_D]].ascast, i64 0, i64 %{{[0-9a-z]+}}, !llvm.index.group ![[IDX_GROUP_D_MUL_ARR:[0-9]+]]
86+
d[i] = 0;
87+
// CHECK: br label %for.cond, !llvm.loop ![[MD_LOOP_MUL_ARR:[0-9]+]]
88+
}
89+
}
90+
6491
// Global ivdep with INF safelen & array-specific ivdep with the same safelen
6592
//
6693
// CHECK: define {{.*}}spir_func void @_Z{{[0-9]+}}ivdep_array_and_globalv()
@@ -180,6 +207,7 @@ int main() {
180207
ivdep_array_no_safelen();
181208
ivdep_array_with_safelen();
182209
ivdep_multiple_arrays();
210+
ivdep_multiple_arrays_template<int>();
183211
ivdep_array_and_global();
184212
ivdep_array_and_inf_global();
185213
ivdep_array_and_greater_global();

clang/test/CodeGenSYCL/no_opaque_intel-fpga-ivdep-array.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,33 @@ void ivdep_multiple_arrays() {
6161
}
6262
}
6363

64+
// CHECK: define {{.*}}spir_func void @_Z{{[0-9]+}}ivdep_multiple_arrays_templateIiEvv()
65+
template <typename T>
66+
void ivdep_multiple_arrays_template() {
67+
// CHECK: %[[ARRAY_A:[0-9a-z]+]] = alloca [10 x i32]
68+
T a[10];
69+
// CHECK: %[[ARRAY_B:[0-9a-z]+]] = alloca [10 x i32]
70+
T b[10];
71+
// CHECK: %[[ARRAY_C:[0-9a-z]+]] = alloca [10 x i32]
72+
T c[10];
73+
// CHECK: %[[ARRAY_D:[0-9a-z]+]] = alloca [10 x i32]
74+
T d[10];
75+
[[intel::ivdep(a, 5)]]
76+
[[intel::ivdep(b, 5)]]
77+
[[intel::ivdep(c)]]
78+
[[intel::ivdep(d)]] for (int i = 0; i != 10; ++i) {
79+
// CHECK: %{{[0-9a-z]+}} = getelementptr inbounds [10 x i32], [10 x i32] addrspace(4)* %[[ARRAY_A]].ascast, i64 0, i64 %{{[0-9a-z]+}}, !llvm.index.group ![[IDX_GROUP_A_MUL_ARR:[0-9]+]]
80+
a[i] = 0;
81+
// CHECK: %{{[0-9a-z]+}} = getelementptr inbounds [10 x i32], [10 x i32] addrspace(4)* %[[ARRAY_B]].ascast, i64 0, i64 %{{[0-9a-z]+}}, !llvm.index.group ![[IDX_GROUP_B_MUL_ARR:[0-9]+]]
82+
b[i] = 0;
83+
// CHECK: %{{[0-9a-z]+}} = getelementptr inbounds [10 x i32], [10 x i32] addrspace(4)* %[[ARRAY_C]].ascast, i64 0, i64 %{{[0-9a-z]+}}, !llvm.index.group ![[IDX_GROUP_C_MUL_ARR:[0-9]+]]
84+
c[i] = 0;
85+
// CHECK: %{{[0-9a-z]+}} = getelementptr inbounds [10 x i32], [10 x i32] addrspace(4)* %[[ARRAY_D]].ascast, i64 0, i64 %{{[0-9a-z]+}}, !llvm.index.group ![[IDX_GROUP_D_MUL_ARR:[0-9]+]]
86+
d[i] = 0;
87+
// CHECK: br label %for.cond, !llvm.loop ![[MD_LOOP_MUL_ARR:[0-9]+]]
88+
}
89+
}
90+
6491
// Global ivdep with INF safelen & array-specific ivdep with the same safelen
6592
//
6693
// CHECK: define {{.*}}spir_func void @_Z{{[0-9]+}}ivdep_array_and_globalv()
@@ -180,6 +207,7 @@ int main() {
180207
ivdep_array_no_safelen();
181208
ivdep_array_with_safelen();
182209
ivdep_multiple_arrays();
210+
ivdep_multiple_arrays_template<int>();
183211
ivdep_array_and_global();
184212
ivdep_array_and_inf_global();
185213
ivdep_array_and_greater_global();

0 commit comments

Comments
 (0)