[Chapel Merge] Fix some issues with constant domain optimization

Branch: refs/heads/master
Revision: 9ef62f4
Author: e-kayrakli
Log Message:

Merge pull request #16397 from e-kayrakli/const-domain-fix

Fix some issues with constant domain optimization

This PR improves constant domain optimization in several ways.

  • Resolve https://github.com/chapel-lang/chapel/issues/16354

  • Make domain literals always constant

  • Fix domain constness w.r.t. argument/task intents

  • Fix constant domain views

  • Fix array views and how their domains’ constness are handled

  • Add bunch of tests

Implementation details:

  • Creates a compiler/optimizations/propagateDomainConstness.cpp that contains
    all the relevant support functions.
  • Adjusts where we remove init/autoCopy during callDestructors and
    removeUnnecessaryAutoCopyCalls
  • Make domain literals always be constant (through parser changes), but unset
    constness if those literals are assigned to a var variable.
  • Add FLAG_CONST to field initialization temps, if the field itself has that
    flag.
  • Add adjustment code after replacing PRIM_MOVEs with PRIM_SET_MEMBERs in
    initializers
  • Adjust test/studies/amr to not define irregular const domain fields in user
    types

Future steps:

  • Depending on what happens with https://github.com/chapel-lang/chapel/issues/16398
    we may need to do some adjustments in this implementation.

  • @mppf brings up a good point about how the domain constness is handled in two
    different ways. (1) we manipulate an additional argument to initCopy et al, to
    set the constness of the LHS, (2) set the definedConst field after the
    assignment [this mostly starts to happen with this PR].

    Initial hope was that with (1) we can handle many cases, and use (2) in
    limited number of scenarios. However, after this PR, I can’t tell which one is
    the “main” way to handle this optimization, as there are some pretty
    significant scenarios where we can’t do (1).

    I still hope that there can be something we can do with the types, and not
    have to have so many AST modifications only to set the constness of a
    variable. But, lumping constness into the type has its own challanges.

  • Can we do something to optimize functions where a var domain is captured with
    const [ref] intent?

proc foo(const d: domain) {
  var a: [d] int;
  // do something with a but do *not* return it
}
var d = {1..10};
foo(d);

As a’s scope is a scope where d is constant, we can avoid tracking it, however, we don’t
do that today because d in foo is just a reference to a non-const domain.

  • Improve how we handle definedConst for privatized instances to reduce
    commcounts.

[Reviewed by @mppf]

Test:

  • [x] standard
  • [x] gasnet

Modified Files:
A compiler/optimizations/propagateDomainConstness.cpp
A test/optimizations/constDomain/arrView.chpl
A test/optimizations/constDomain/arrView.good
A test/optimizations/constDomain/constIntoVar.chpl
A test/optimizations/constDomain/constIntoVar.good
A test/optimizations/constDomain/constIntoVar2.chpl
A test/optimizations/constDomain/constIntoVar2.good
A test/optimizations/constDomain/domainArgs.chpl
A test/optimizations/constDomain/domainArgs.good
A test/optimizations/constDomain/domainField.chpl
A test/optimizations/constDomain/domainField.good
A test/optimizations/constDomain/domainFieldUserInit.chpl
A test/optimizations/constDomain/domainFieldUserInit.good
A test/optimizations/constDomain/domainView.chpl
A test/optimizations/constDomain/domainView.good
A test/optimizations/constDomain/forallIntent.chpl
A test/optimizations/constDomain/forallIntent.good
M compiler/AST/build.cpp
M compiler/include/optimizations.h
M compiler/optimizations/Makefile.share
M compiler/optimizations/removeUnnecessaryAutoCopyCalls.cpp
M compiler/parser/bison-chapel.cpp
M compiler/parser/chapel.ypp
M compiler/passes/InitNormalize.cpp
M compiler/resolution/callDestructors.cpp
M compiler/resolution/cleanups.cpp
M compiler/resolution/functionResolution.cpp
M compiler/resolution/initializerResolution.cpp
M compiler/resolution/wrappers.cpp
M modules/internal/ArrayViewSlice.chpl
M modules/internal/ChapelArray.chpl
M test/arrays/slices/commCounts/sliceBlockWithRanges.good
M test/arrays/slices/commCounts/sliceBlockWithRanges.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/assignReindex.block.good
M test/distributions/robust/arithmetic/performance/multilocale/assignReindex.block.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/assignReindex.cyclic.good
M test/distributions/robust/arithmetic/performance/multilocale/assignReindex.cyclic.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/assignReindex.replicated.good
M test/distributions/robust/arithmetic/performance/multilocale/assignReindex.replicated.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/assignSlice.block.good
M test/distributions/robust/arithmetic/performance/multilocale/assignSlice.block.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/assignSlice.cyclic.good
M test/distributions/robust/arithmetic/performance/multilocale/assignSlice.cyclic.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/assignSlice.replicated.good
M test/distributions/robust/arithmetic/performance/multilocale/assignSlice.replicated.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/reduceSlice.block.good
M test/distributions/robust/arithmetic/performance/multilocale/reduceSlice.block.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/reduceSlice.cyclic.good
M test/distributions/robust/arithmetic/performance/multilocale/reduceSlice.cyclic.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/reduceSlice.replicated.good
M test/distributions/robust/arithmetic/performance/multilocale/reduceSlice.replicated.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/sliceOps.block.good
M test/distributions/robust/arithmetic/performance/multilocale/sliceOps.block.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/sliceOps.cyclic.good
M test/distributions/robust/arithmetic/performance/multilocale/sliceOps.cyclic.na-none.good
M test/distributions/robust/arithmetic/performance/multilocale/sliceOps.replicated.good
M test/studies/amr/lib/amr/AMRHierarchy_def.chpl
M test/studies/amr/lib/amr/BergerRigoutsosClustering.chpl
M test/studies/amr/lib/cfboundary/CoarseningTransfer.chpl
M test/studies/amr/lib/grid/Grid_def.chpl
M test/studies/amr/lib/level/Level_def.chpl

Compare: https://github.com/chapel-lang/chapel/compare/50284c3953f3...9ef62f423eb4