[OpenMP] Avoid VLAs for some reductions on array sections
authorJonas Hahnfeld <hahnjo@hahnjo.de>
Mon, 23 Oct 2017 19:01:35 +0000 (19:01 +0000)
committerJonas Hahnfeld <hahnjo@hahnjo.de>
Mon, 23 Oct 2017 19:01:35 +0000 (19:01 +0000)
commit4525c824280a112c7772361669a6463e36fd8c4f
tree16fba40d7604d5ccd5ad7924dd5ac52e99badb1c
parentdbeb64d2dad9ddd82d38e99d181ec111b2079faa
[OpenMP] Avoid VLAs for some reductions on array sections

In some cases the compiler can deduce the length of an array section
as constants. With this information, VLAs can be avoided in place of
a constant sized array or even a scalar value if the length is 1.
Example:
int a[4], b[2];
pragma omp parallel reduction(+: a[1:2], b[1:1])
{ }

For chained array sections, this optimization is restricted to cases
where all array sections except the last have a constant length 1.
This trivially guarantees that there are no holes in the memory region
that needs to be privatized.
Example:
int c[3][4];
pragma omp parallel reduction(+: c[1:1][1:2])
{ }

This relands commit r316229 that I reverted in r316235 because it
failed on some bots. During investigation I found that this was because
Clang and GCC evaluate the two arguments to emplace_back() in
ReductionCodeGen::emitSharedLValue() in a different order, hence
leading to a different order of generated instructions in the final
LLVM IR. Fix this by passing in the arguments from temporary variables
that are evaluated in a defined order.

Differential Revision: https://reviews.llvm.org/D39136

llvm-svn: 316362
clang/lib/CodeGen/CGOpenMPRuntime.cpp
clang/lib/CodeGen/CGStmtOpenMP.cpp
clang/lib/Sema/SemaOpenMP.cpp
clang/test/OpenMP/for_reduction_codegen.cpp
clang/test/OpenMP/for_reduction_codegen_UDR.cpp