From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2136) id 2943B386EC59; Fri, 2 Oct 2020 09:41:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2943B386EC59 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Aldy Hernandez To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc(refs/users/aldyh/heads/ranger-staging)] Merge commit '968ec08efefeea6fbc0cdc379e98ce3e28904083' into me/ranger-staging X-Act-Checkin: gcc X-Git-Author: Aldy Hernandez X-Git-Refname: refs/users/aldyh/heads/ranger-staging X-Git-Oldrev: 9abe16354e2bbfc851e0d10e0e15e7fe187a9fc4 X-Git-Newrev: 8322a85bf68d1508da58aeb61b0852b7634ee765 Message-Id: <20201002094104.2943B386EC59@sourceware.org> Date: Fri, 2 Oct 2020 09:41:04 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Oct 2020 09:41:04 -0000 https://gcc.gnu.org/g:8322a85bf68d1508da58aeb61b0852b7634ee765 commit 8322a85bf68d1508da58aeb61b0852b7634ee765 Merge: 9abe16354e2 968ec08efef Author: Aldy Hernandez Date: Fri Oct 2 10:07:59 2020 +0200 Merge commit '968ec08efefeea6fbc0cdc379e98ce3e28904083' into me/ranger-staging Diff: ChangeLog | 4 + MAINTAINERS | 1 + contrib/ChangeLog | 10 + contrib/clang-format | 2 +- contrib/mklog.py | 9 +- fixincludes/ChangeLog | 20 + fixincludes/fixfixes.c | 4 +- fixincludes/fixincl.x | 65 +- fixincludes/inclhack.def | 31 +- fixincludes/tests/base/sys/inttypes.h | 14 + fixincludes/tests/base/sys/socket.h | 2 + gcc/ChangeLog | 1970 +++++++++++++++++++- gcc/DATESTAMP | 2 +- gcc/Makefile.in | 5 + gcc/ada/ChangeLog | 107 +- gcc/ada/fe.h | 1 + gcc/ada/gcc-interface/decl.c | 75 +- gcc/ada/gcc-interface/gigi.h | 5 + gcc/ada/gcc-interface/misc.c | 13 +- gcc/ada/gcc-interface/targtyps.c | 10 + gcc/ada/gcc-interface/trans.c | 50 +- gcc/ada/gcc-interface/utils.c | 39 +- gcc/alias.c | 10 +- gcc/alias.h | 1 + gcc/analyzer/ChangeLog | 329 ++++ gcc/analyzer/analysis-plan.cc | 1 + gcc/analyzer/analyzer-logging.cc | 2 + gcc/analyzer/analyzer.cc | 9 +- gcc/analyzer/analyzer.h | 4 +- gcc/analyzer/analyzer.opt | 12 + gcc/analyzer/call-string.cc | 31 + gcc/analyzer/call-string.h | 2 + gcc/analyzer/checker-path.cc | 30 +- gcc/analyzer/constraint-manager.cc | 127 +- gcc/analyzer/constraint-manager.h | 6 + gcc/analyzer/diagnostic-manager.cc | 128 +- gcc/analyzer/diagnostic-manager.h | 4 + gcc/analyzer/engine.cc | 590 +++++- gcc/analyzer/exploded-graph.h | 33 +- gcc/analyzer/pending-diagnostic.cc | 1 + gcc/analyzer/program-point.cc | 75 +- gcc/analyzer/program-point.h | 4 + gcc/analyzer/program-state.cc | 101 +- gcc/analyzer/program-state.h | 10 +- gcc/analyzer/region-model-impl-calls.cc | 48 + gcc/analyzer/region-model-manager.cc | 1 + gcc/analyzer/region-model-reachability.cc | 1 + gcc/analyzer/region-model.cc | 135 +- gcc/analyzer/region-model.h | 60 +- gcc/analyzer/region.cc | 12 + gcc/analyzer/sm-file.cc | 1 + gcc/analyzer/sm-malloc.cc | 9 +- gcc/analyzer/sm-pattern-test.cc | 1 + gcc/analyzer/sm-sensitive.cc | 1 + gcc/analyzer/sm-signal.cc | 7 + gcc/analyzer/sm-taint.cc | 1 + gcc/analyzer/sm.cc | 36 + gcc/analyzer/sm.h | 3 + gcc/analyzer/state-purge.cc | 1 + gcc/analyzer/store.cc | 118 ++ gcc/analyzer/store.h | 7 + gcc/analyzer/supergraph.cc | 112 ++ gcc/analyzer/supergraph.h | 6 + gcc/analyzer/svalue.cc | 12 + gcc/attribs.c | 284 ++- gcc/attribs.h | 67 +- gcc/bb-reorder.c | 4 + gcc/builtins.c | 349 +++- gcc/builtins.def | 20 +- gcc/builtins.h | 18 +- gcc/c-family/ChangeLog | 141 +- gcc/c-family/c-attribs.c | 777 ++++++-- gcc/c-family/c-common.c | 24 + gcc/c-family/c-common.def | 24 + gcc/c-family/c-common.h | 58 +- gcc/c-family/c-dump.c | 38 + gcc/c-family/c-gimplify.c | 422 +++++ gcc/c-family/c-indentation.c | 61 +- gcc/c-family/c-pragma.c | 13 +- gcc/c-family/c-pretty-print.c | 153 +- gcc/c-family/c-warn.c | 566 ++++++ gcc/c-family/c.opt | 23 +- gcc/c/ChangeLog | 58 +- gcc/c/c-decl.c | 241 ++- gcc/c/c-lang.h | 3 +- gcc/c/c-objc-common.h | 2 + gcc/c/c-parser.c | 152 +- gcc/c/c-tree.h | 23 +- gcc/c/c-typeck.c | 227 +-- gcc/calls.c | 289 +-- gcc/cfgexpand.c | 14 +- gcc/cfgloop.c | 4 +- gcc/cfgloop.h | 8 +- gcc/cfgloopmanip.c | 3 +- gcc/cgraph.c | 25 +- gcc/cgraph.h | 3 + gcc/cgraphunit.c | 6 +- gcc/collect2.c | 26 +- gcc/common.opt | 6 +- gcc/common/config/aarch64/aarch64-common.c | 7 +- gcc/common/config/i386/cpuinfo.h | 16 + gcc/common/config/i386/i386-common.c | 65 +- gcc/common/config/i386/i386-cpuinfo.h | 3 + gcc/common/config/i386/i386-isas.h | 3 + gcc/config.gcc | 7 +- gcc/config.in | 13 + gcc/config/aarch64/aarch64-arches.def | 1 + gcc/config/aarch64/aarch64-builtins.c | 59 +- gcc/config/aarch64/aarch64-c.c | 7 +- gcc/config/aarch64/aarch64-cores.def | 10 + gcc/config/aarch64/aarch64-option-extensions.def | 2 +- gcc/config/aarch64/aarch64-protos.h | 20 + gcc/config/aarch64/aarch64-simd-builtins.def | 5 +- gcc/config/aarch64/aarch64-tune.md | 2 +- gcc/config/aarch64/aarch64.c | 209 ++- gcc/config/aarch64/aarch64.h | 5 + gcc/config/aarch64/aarch64.md | 102 +- gcc/config/aarch64/arm_neon.h | 250 ++- gcc/config/arm/arm-c.c | 4 +- gcc/config/arm/arm-cpus.in | 55 + gcc/config/arm/arm-protos.h | 1 - gcc/config/arm/arm-tables.opt | 15 + gcc/config/arm/arm-tune.md | 6 +- gcc/config/arm/arm.c | 110 +- gcc/config/arm/arm.h | 45 + gcc/config/arm/arm.md | 14 +- gcc/config/arm/arm.opt | 15 +- gcc/config/arm/arm_mve.h | 167 +- gcc/config/arm/constraints.md | 9 +- gcc/config/arm/iterators.md | 8 - gcc/config/arm/neon.md | 47 +- gcc/config/arm/predicates.md | 12 + gcc/config/arm/thumb2.md | 51 +- gcc/config/arm/vec-common.md | 42 +- gcc/config/arm/vfp.md | 36 +- gcc/config/bpf/bpf.md | 27 +- gcc/config/csky/csky-elf.h | 10 +- gcc/config/csky/csky-linux-elf.h | 2 +- gcc/config/csky/csky-protos.h | 2 + gcc/config/csky/csky.c | 100 +- gcc/config/csky/csky.h | 34 +- gcc/config/csky/csky.md | 84 + gcc/config/csky/csky.opt | 4 + gcc/config/csky/t-csky-elf | 13 +- gcc/config/csky/t-csky-linux | 8 +- gcc/config/darwin-protos.h | 2 +- gcc/config/darwin.c | 3 +- gcc/config/gcn/gcn-passes.def | 19 - gcc/config/gcn/gcn-tree.c | 119 -- gcc/config/gcn/gcn.c | 13 +- gcc/config/gcn/gcn.md | 2 + gcc/config/gcn/t-gcn-hsa | 1 - gcc/config/i386/amxbf16intrin.h | 52 + gcc/config/i386/amxint8intrin.h | 61 + gcc/config/i386/amxtileintrin.h | 98 + gcc/config/i386/avx512vp2intersectintrin.h | 23 + gcc/config/i386/avx512vp2intersectvlintrin.h | 23 + gcc/config/i386/cpuid.h | 3 + gcc/config/i386/enqcmdintrin.h | 8 +- gcc/config/i386/i386-builtins.c | 6 +- gcc/config/i386/i386-c.c | 18 +- gcc/config/i386/i386-options.c | 79 +- gcc/config/i386/i386-options.h | 4 +- gcc/config/i386/i386.c | 8 +- gcc/config/i386/i386.h | 25 +- gcc/config/i386/i386.md | 20 +- gcc/config/i386/i386.opt | 14 +- gcc/config/i386/immintrin.h | 6 + gcc/config/i386/pconfigintrin.h | 23 + gcc/config/i386/sse.md | 6 +- gcc/config/i386/t-rtems | 8 +- gcc/config/i386/tsxldtrkintrin.h | 23 + gcc/config/i386/wbnoinvdintrin.h | 23 + gcc/config/i386/x86-tune-costs.h | 90 +- gcc/config/linux-protos.h | 2 +- gcc/config/linux.c | 3 +- gcc/config/msp430/msp430.c | 224 ++- gcc/config/nios2/nios2.c | 27 +- gcc/config/nvptx/nvptx.c | 44 +- gcc/config/nvptx/nvptx.md | 34 + gcc/config/pa/pa-hpux11.h | 5 - gcc/config/pa/pa.c | 33 +- gcc/config/pa/pa.md | 140 +- gcc/config/pa/pa32-linux.h | 5 + gcc/config/pa/pa64-hpux.h | 12 +- gcc/config/pru/pru.c | 6 +- gcc/config/riscv/riscv-c.c | 9 +- gcc/config/riscv/riscv.h | 2 +- gcc/config/rs6000/linux64.h | 17 +- gcc/config/rs6000/power10.md | 8 +- gcc/config/rs6000/power6.md | 21 - gcc/config/rs6000/power8.md | 8 +- gcc/config/rs6000/power9.md | 8 +- gcc/config/rs6000/ppc-asm.h | 9 + gcc/config/rs6000/predicates.md | 2 +- gcc/config/rs6000/rs6000-c.c | 3 + gcc/config/rs6000/rs6000-call.c | 2 +- gcc/config/rs6000/rs6000-internal.h | 2 +- gcc/config/rs6000/rs6000-logue.c | 21 +- gcc/config/rs6000/rs6000-p8swap.c | 147 +- gcc/config/rs6000/rs6000-protos.h | 7 +- gcc/config/rs6000/rs6000.c | 225 ++- gcc/config/rs6000/rs6000.md | 159 +- gcc/config/rs6000/smmintrin.h | 30 + gcc/config/rs6000/vsx.md | 14 +- gcc/config/s390/s390-c.c | 7 +- gcc/config/s390/s390.c | 43 +- gcc/config/s390/s390.md | 54 +- gcc/config/s390/vector.md | 2 +- gcc/configure | 17 +- gcc/configure.ac | 13 +- gcc/convert.c | 8 +- gcc/cp/ChangeLog | 419 +++++ gcc/cp/call.c | 34 +- gcc/cp/constexpr.c | 9 +- gcc/cp/constraint.cc | 28 +- gcc/cp/coroutines.cc | 2 +- gcc/cp/cp-gimplify.c | 471 +---- gcc/cp/cp-objcp-common.c | 13 +- gcc/cp/cp-tree.def | 31 +- gcc/cp/cp-tree.h | 104 +- gcc/cp/cxx-pretty-print.c | 78 - gcc/cp/decl.c | 404 ++-- gcc/cp/decl2.c | 3 - gcc/cp/dump.c | 31 - gcc/cp/friend.c | 12 +- gcc/cp/lambda.c | 7 +- gcc/cp/name-lookup.c | 647 ++++--- gcc/cp/name-lookup.h | 59 +- gcc/cp/parser.c | 166 +- gcc/cp/pt.c | 675 ++++--- gcc/cp/ptree.c | 6 +- gcc/cp/rtti.c | 11 +- gcc/cp/semantics.c | 26 +- gcc/cp/tree.c | 30 +- gcc/cp/typeck2.c | 2 +- gcc/d/ChangeLog | 36 + gcc/d/d-builtins.cc | 8 + gcc/d/d-codegen.cc | 1 + gcc/d/d-convert.cc | 4 +- gcc/d/d-lang.cc | 58 +- gcc/d/decl.cc | 57 +- gcc/d/intrinsics.cc | 2 +- gcc/d/lang.opt | 6 +- gcc/d/types.cc | 5 +- gcc/doc/analyzer.texi | 6 +- gcc/doc/cppenv.texi | 2 +- gcc/doc/extend.texi | 59 +- gcc/doc/generic.texi | 56 +- gcc/doc/invoke.texi | 268 ++- gcc/doc/sourcebuild.texi | 9 + gcc/doc/tm.texi | 11 +- gcc/emit-rtl.h | 3 + gcc/expr.c | 18 +- gcc/fortran/ChangeLog | 128 ++ gcc/fortran/decl.c | 9 + gcc/fortran/expr.c | 26 +- gcc/fortran/f95-lang.c | 4 +- gcc/fortran/interface.c | 4 + gcc/fortran/iresolve.c | 14 - gcc/fortran/symbol.c | 2 +- gcc/fortran/trans-array.c | 15 +- gcc/fortran/trans-decl.c | 26 +- gcc/fortran/trans-expr.c | 29 +- gcc/fortran/trans-intrinsic.c | 167 ++ gcc/fortran/trans-io.c | 46 +- gcc/fortran/trans-openmp.c | 68 +- gcc/fortran/trans-stmt.c | 49 +- gcc/fortran/trans.c | 23 +- gcc/fortran/trans.h | 6 +- gcc/function.c | 17 +- gcc/gengtype.c | 2 +- gcc/genmatch.c | 10 +- gcc/gensupport.c | 2 +- gcc/ggc-common.c | 28 +- gcc/ggc-page.c | 17 +- gcc/gimple-array-bounds.cc | 428 ++++- gcc/gimple-isel.cc | 90 +- gcc/gimple-loop-versioning.cc | 3 +- gcc/gimple-range-cache.cc | 24 +- gcc/gimple-range-cache.h | 4 +- gcc/gimple-range-edge.cc | 4 +- gcc/gimple-range-edge.h | 2 +- gcc/gimple-ssa-sprintf.c | 56 +- gcc/gimple-ssa-store-merging.c | 76 +- gcc/gimplify.c | 25 +- gcc/go/ChangeLog | 6 + gcc/go/go-gcc.cc | 8 +- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/expressions.cc | 50 +- gcc/go/gofrontend/gogo.cc | 4 + gcc/go/gofrontend/statements.cc | 27 +- gcc/go/gofrontend/statements.h | 4 +- gcc/hash-table.h | 2 +- gcc/input.c | 2 + gcc/internal-fn.c | 45 +- gcc/internal-fn.def | 2 + gcc/ipa-fnsummary.c | 90 +- gcc/ipa-fnsummary.h | 2 + gcc/ipa-inline-transform.c | 13 +- gcc/ipa-inline.c | 3 - gcc/ipa-modref-tree.c | 253 +++ gcc/ipa-modref-tree.h | 515 +++++ gcc/ipa-modref.c | 1697 +++++++++++++++++ gcc/ipa-modref.h | 52 + gcc/ipa-predicate.h | 10 +- gcc/ipa-prop.c | 6 +- gcc/ipa-pure-const.c | 10 +- gcc/ira-build.c | 12 +- gcc/ira-color.c | 4 +- gcc/ira.c | 8 +- gcc/jit/ChangeLog | 40 + gcc/jit/docs/_build/texinfo/libgccjit.texi | 1080 ++++++----- gcc/jit/docs/topics/compatibility.rst | 7 + gcc/jit/docs/topics/expressions.rst | 21 + gcc/jit/jit-playback.c | 107 +- gcc/jit/jit-playback.h | 17 + gcc/jit/jit-recording.c | 143 +- gcc/jit/jit-recording.h | 38 +- gcc/jit/libgccjit++.h | 10 + gcc/jit/libgccjit.c | 39 + gcc/jit/libgccjit.h | 15 + gcc/jit/libgccjit.map | 7 +- gcc/langhooks-def.h | 2 +- gcc/langhooks.c | 2 +- gcc/langhooks.h | 2 +- gcc/loop-unroll.c | 3 +- gcc/lra-constraints.c | 12 +- gcc/lto-section-in.c | 1 + gcc/lto-streamer-out.c | 2 +- gcc/lto-streamer.h | 1 + gcc/match.pd | 54 +- gcc/objc/ChangeLog | 14 + gcc/objc/objc-act.c | 6 +- gcc/objc/objc-gnu-runtime-abi-01.c | 4 +- gcc/objc/objc-next-runtime-abi-01.c | 4 +- gcc/objcp/ChangeLog | 11 + gcc/objcp/objcp-decl.c | 4 +- gcc/omp-expand.c | 514 +++-- gcc/omp-low.c | 4 +- gcc/omp-offload.c | 51 +- gcc/opt-read.awk | 1 + gcc/optabs.c | 35 +- gcc/optabs.h | 4 + gcc/optc-save-gen.awk | 387 +++- gcc/opth-gen.awk | 19 +- gcc/opts.c | 8 + gcc/params.opt | 16 + gcc/passes.def | 4 + gcc/predict.c | 9 +- gcc/print-tree.c | 2 +- gcc/profile.c | 8 +- gcc/range-op.cc | 15 + gcc/rtlanal.c | 4 + gcc/sel-sched-ir.c | 112 +- gcc/selftest-run-tests.c | 1 + gcc/selftest.h | 1 + gcc/system.h | 3 +- gcc/target-globals.c | 4 +- gcc/target.def | 13 +- gcc/targhooks.c | 9 +- gcc/targhooks.h | 6 +- gcc/testsuite/ChangeLog | 1239 +++++++++++- gcc/testsuite/c-c++-common/Warray-bounds-6.c | 19 +- gcc/testsuite/c-c++-common/Warray-bounds.c | 2 +- .../c-c++-common/Wduplicated-branches-15.c | 32 + .../c-c++-common/Wmisleading-indentation-5.c | 56 + .../c-c++-common/Wsizeof-pointer-memaccess1.c | 4 +- .../c-c++-common/builtin-has-attribute-3.c | 20 +- gcc/testsuite/c-c++-common/ident-1b.c | 1 + gcc/testsuite/c-c++-common/ident-2b.c | 1 + gcc/testsuite/g++.dg/analyzer/placement-new.C | 26 + gcc/testsuite/g++.dg/asan/pr97145.C | 7 + gcc/testsuite/g++.dg/concepts/diagnostic15.C | 16 + gcc/testsuite/g++.dg/concepts/local-extern.C | 39 + gcc/testsuite/g++.dg/cpp0x/decltype-96652.C | 14 + gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv14.C | 10 + gcc/testsuite/g++.dg/cpp0x/move-return4.C | 17 + gcc/testsuite/g++.dg/cpp0x/vt-58156.C | 13 + gcc/testsuite/g++.dg/cpp1y/constexpr-90199.C | 28 + gcc/testsuite/g++.dg/cpp1y/new1.C | 4 +- gcc/testsuite/g++.dg/cpp1z/class-deduction73.C | 41 + gcc/testsuite/g++.dg/cpp1z/class-deduction74.C | 31 + gcc/testsuite/g++.dg/cpp2a/concepts-lambda13.C | 18 + gcc/testsuite/g++.dg/cpp2a/concepts-lambda14.C | 25 + gcc/testsuite/g++.dg/cpp2a/concepts-pr68828.C | 35 + gcc/testsuite/g++.dg/cpp2a/concepts-pr86002.C | 19 + gcc/testsuite/g++.dg/cpp2a/concepts-pr91525.C | 17 + gcc/testsuite/g++.dg/cpp2a/concepts-ttp2.C | 11 + gcc/testsuite/g++.dg/cpp2a/concepts-variadic1.C | 28 + gcc/testsuite/g++.dg/cpp2a/consteval18.C | 26 + .../g++.dg/cpp2a/constexpr-indeterminate1.C | 46 + gcc/testsuite/g++.dg/cpp2a/constexpr-new14.C | 73 + gcc/testsuite/g++.dg/cpp2a/desig17.C | 19 + .../g++.dg/cpp2a/is-constant-evaluated11.C | 16 + gcc/testsuite/g++.dg/debug/dwarf2/align-1.C | 2 +- gcc/testsuite/g++.dg/debug/dwarf2/align-2.C | 2 +- gcc/testsuite/g++.dg/debug/dwarf2/align-3.C | 2 +- gcc/testsuite/g++.dg/debug/dwarf2/align-4.C | 2 +- gcc/testsuite/g++.dg/debug/dwarf2/align-5.C | 2 +- gcc/testsuite/g++.dg/debug/dwarf2/align-6.C | 2 +- .../debug/dwarf2/defaulted-member-function-1.C | 2 +- .../debug/dwarf2/defaulted-member-function-2.C | 2 +- .../debug/dwarf2/defaulted-member-function-3.C | 2 +- gcc/testsuite/g++.dg/debug/dwarf2/inline-var-1.C | 12 +- gcc/testsuite/g++.dg/debug/dwarf2/inline-var-2.C | 2 +- gcc/testsuite/g++.dg/debug/dwarf2/inline-var-3.C | 29 + .../g++.dg/debug/dwarf2/noreturn-function.C | 2 +- gcc/testsuite/g++.dg/debug/dwarf2/ptrdmem-1.C | 4 +- gcc/testsuite/g++.dg/debug/dwarf2/ref-2.C | 4 +- gcc/testsuite/g++.dg/debug/dwarf2/ref-3.C | 10 +- gcc/testsuite/g++.dg/debug/dwarf2/ref-4.C | 6 +- gcc/testsuite/g++.dg/debug/dwarf2/refqual-1.C | 4 +- gcc/testsuite/g++.dg/debug/dwarf2/refqual-2.C | 4 +- gcc/testsuite/g++.dg/ext/attr-access.C | 12 +- gcc/testsuite/g++.dg/ext/attrib62.C | 7 + gcc/testsuite/g++.dg/ext/timevar1.C | 4 +- gcc/testsuite/g++.dg/ext/timevar2.C | 4 +- gcc/testsuite/g++.dg/gcov/pr97069.C | 20 + gcc/testsuite/g++.dg/gomp/udr-2.C | 1 + gcc/testsuite/g++.dg/other/i386-2.C | 3 +- gcc/testsuite/g++.dg/other/i386-3.C | 3 +- gcc/testsuite/g++.dg/spellcheck-inttypes.C | 3 + gcc/testsuite/g++.dg/template/local-fn3.C | 17 + gcc/testsuite/g++.dg/template/local-fn4.C | 21 + gcc/testsuite/g++.dg/template/local-var1.C | 20 + gcc/testsuite/g++.dg/template/pr97105.C | 6 + gcc/testsuite/g++.dg/tree-ssa/pr96979.C | 48 + gcc/testsuite/g++.dg/vect/pr97255.cc | 44 + .../g++.dg/warn/Wctad-maybe-unsupported.C | 88 + .../g++.dg/warn/Wctad-maybe-unsupported.h | 4 + .../g++.dg/warn/Wctad-maybe-unsupported2.C | 6 + .../g++.dg/warn/Wctad-maybe-unsupported3.C | 6 + gcc/testsuite/g++.dg/warn/Wrange-loop-construct.C | 207 ++ gcc/testsuite/g++.dg/warn/Wuninitialized-11.C | 26 + gcc/testsuite/g++.old-deja/g++.pt/friend34.C | 5 +- gcc/testsuite/g++.target/i386/pr97054.C | 96 + gcc/testsuite/gcc.c-torture/compile/pr71109.c | 1 + gcc/testsuite/gcc.c-torture/compile/pr83051-2.c | 2 + gcc/testsuite/gcc.c-torture/compile/pr89663-1.c | 1 + gcc/testsuite/gcc.c-torture/compile/pr89663-2.c | 1 + gcc/testsuite/gcc.c-torture/compile/pr96796.c | 1 + gcc/testsuite/gcc.c-torture/compile/pr97243.c | 10 + gcc/testsuite/gcc.c-torture/execute/pr97073.c | 21 + gcc/testsuite/gcc.dg/Warray-bounds-30.c | 3 +- gcc/testsuite/gcc.dg/Warray-bounds-63.c | 54 + gcc/testsuite/gcc.dg/Warray-bounds-64.c | 60 + gcc/testsuite/gcc.dg/Warray-bounds-65.c | 202 ++ gcc/testsuite/gcc.dg/Warray-bounds-66.c | 257 +++ gcc/testsuite/gcc.dg/Warray-bounds-67.c | 36 + gcc/testsuite/gcc.dg/Warray-parameter-2.c | 45 + gcc/testsuite/gcc.dg/Warray-parameter-3.c | 89 + gcc/testsuite/gcc.dg/Warray-parameter-4.c | 119 ++ gcc/testsuite/gcc.dg/Warray-parameter-5.c | 14 + gcc/testsuite/gcc.dg/Warray-parameter-6.c | 9 + gcc/testsuite/gcc.dg/Warray-parameter-7.c | 25 + gcc/testsuite/gcc.dg/Warray-parameter-8.c | 36 + gcc/testsuite/gcc.dg/Warray-parameter.c | 187 ++ .../gcc.dg/Wbuiltin-declaration-mismatch-9.c | 3 + gcc/testsuite/gcc.dg/Wnonnull-4.c | 173 ++ gcc/testsuite/gcc.dg/Wstringop-overflow-23.c | 16 +- gcc/testsuite/gcc.dg/Wstringop-overflow-24.c | 8 +- gcc/testsuite/gcc.dg/Wstringop-overflow-40.c | 120 ++ gcc/testsuite/gcc.dg/Wstringop-overflow-42.c | 4 + gcc/testsuite/gcc.dg/Wstringop-overflow-43.c | 178 ++ gcc/testsuite/gcc.dg/Wstringop-overflow-44.c | 129 ++ gcc/testsuite/gcc.dg/Wvla-parameter-2.c | 75 + gcc/testsuite/gcc.dg/Wvla-parameter-3.c | 68 + gcc/testsuite/gcc.dg/Wvla-parameter-4.c | 99 + gcc/testsuite/gcc.dg/Wvla-parameter-5.c | 22 + gcc/testsuite/gcc.dg/Wvla-parameter-6.c | 34 + gcc/testsuite/gcc.dg/Wvla-parameter-7.c | 36 + gcc/testsuite/gcc.dg/Wvla-parameter.c | 136 ++ gcc/testsuite/gcc.dg/analyzer/bzip2-arg-parse-1.c | 95 + gcc/testsuite/gcc.dg/analyzer/feasibility-2.c | 20 + gcc/testsuite/gcc.dg/analyzer/getchar-1.c | 19 + .../analyzer/loop-0-up-to-n-by-1-with-iter-obj.c | 3 +- .../gcc.dg/analyzer/loop-n-down-to-1-by-1.c | 4 +- gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1a.c | 20 +- gcc/testsuite/gcc.dg/analyzer/memcpy-1.c | 43 + .../analyzer/pr93355-localealias-feasibility.c | 79 + .../analyzer/pr93355-localealias-simplified.c | 45 + .../gcc.dg/analyzer/pr93355-localealias.c | 391 ++++ gcc/testsuite/gcc.dg/analyzer/pr94851-1.c | 3 +- gcc/testsuite/gcc.dg/analyzer/pr96646.c | 24 + gcc/testsuite/gcc.dg/analyzer/pr96650-1-notrans.c | 30 + gcc/testsuite/gcc.dg/analyzer/pr96650-1-trans.c | 30 + gcc/testsuite/gcc.dg/analyzer/pr96650-2-notrans.c | 30 + gcc/testsuite/gcc.dg/analyzer/pr96650-2-trans.c | 30 + gcc/testsuite/gcc.dg/analyzer/pr96653.c | 1104 +++++++++++ gcc/testsuite/gcc.dg/analyzer/pr96841.c | 23 + gcc/testsuite/gcc.dg/analyzer/pr97029.c | 7 + gcc/testsuite/gcc.dg/analyzer/pr97130.c | 10 + gcc/testsuite/gcc.dg/analyzer/pr97233.c | 8 + gcc/testsuite/gcc.dg/analyzer/rhbz1878600.c | 34 + .../gcc.dg/analyzer/signal-registration-loc.c | 23 + gcc/testsuite/gcc.dg/analyzer/strcpy-1.c | 18 + gcc/testsuite/gcc.dg/analyzer/strdup-1.c | 21 + gcc/testsuite/gcc.dg/analyzer/strndup-1.c | 21 + gcc/testsuite/gcc.dg/atomic/stdatomic-vm.c | 1 + gcc/testsuite/gcc.dg/attr-access-2.c | 122 ++ gcc/testsuite/gcc.dg/attr-access-none.c | 2 +- gcc/testsuite/gcc.dg/attr-access-read-write-2.c | 4 +- gcc/testsuite/gcc.dg/attr-alloc_align-5.c | 23 + gcc/testsuite/gcc.dg/attr-alloc_size-13.c | 34 + gcc/testsuite/gcc.dg/attr-section.c | 13 + gcc/testsuite/gcc.dg/builtin-apply2.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/dwarf2-macro.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/dwarf2-macro2.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/inline2.c | 4 +- gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/inline6.c | 69 + gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c | 2 +- .../debug/dwarf2/noreturn-function-attribute.c | 2 +- .../debug/dwarf2/noreturn-function-keyword.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-5.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-6.c | 2 +- gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-7.c | 16 + gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-8.c | 11 + gcc/testsuite/gcc.dg/debug/dwarf2/pr71855.c | 2 +- gcc/testsuite/gcc.dg/dfp/composite-type.c | 3 + gcc/testsuite/gcc.dg/format/pr96935.c | 9 + gcc/testsuite/gcc.dg/gimplefe-44.c | 1 + gcc/testsuite/gcc.dg/gomp/block-7.c | 12 +- gcc/testsuite/gcc.dg/ifcvt-3.c | 2 +- gcc/testsuite/gcc.dg/independent-cloneids-1.c | 18 +- gcc/testsuite/gcc.dg/ipa/ipa-pta-13.c | 2 +- gcc/testsuite/gcc.dg/ipa/ipa-sra-1.c | 2 +- gcc/testsuite/gcc.dg/ipa/ipa-sra-12.c | 2 +- gcc/testsuite/gcc.dg/ipa/ipa-sra-13.c | 2 +- gcc/testsuite/gcc.dg/ipa/ipa-sra-14.c | 2 +- gcc/testsuite/gcc.dg/ipa/ipa-sra-15.c | 2 +- gcc/testsuite/gcc.dg/ipa/remref-2a.c | 2 +- gcc/testsuite/gcc.dg/ipa/symver1.c | 1 + gcc/testsuite/gcc.dg/lto/modref-1_0.c | 14 + gcc/testsuite/gcc.dg/lto/modref-1_1.c | 13 + gcc/testsuite/gcc.dg/pr87314-1.c | 4 +- gcc/testsuite/gcc.dg/pr94234-2.c | 39 + gcc/testsuite/gcc.dg/pr94234-3.c | 42 + gcc/testsuite/gcc.dg/pr94600-1.c | 7 +- gcc/testsuite/gcc.dg/pr94600-3.c | 7 +- gcc/testsuite/gcc.dg/pr96453.c | 22 + gcc/testsuite/gcc.dg/pr96466.c | 19 + gcc/testsuite/gcc.dg/pr97078.c | 9 + gcc/testsuite/gcc.dg/pr97192.c | 16 + gcc/testsuite/gcc.dg/pr97238.c | 12 + gcc/testsuite/gcc.dg/spellcheck-inttypes.c | 2 +- gcc/testsuite/gcc.dg/store_merging_31.c | 27 + gcc/testsuite/gcc.dg/store_merging_32.c | 129 ++ gcc/testsuite/gcc.dg/tls/thr-cse-1.c | 5 +- gcc/testsuite/gcc.dg/torture/pr57147-1.c | 4 +- gcc/testsuite/gcc.dg/torture/pr57147-3.c | 3 +- gcc/testsuite/gcc.dg/torture/pr97135.c | 21 + .../gcc.dg/torture/stackalign/builtin-apply-2.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/20030807-10.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/local-pure-const.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/modref-1.c | 45 + gcc/testsuite/gcc.dg/tree-ssa/modref-2.c | 26 + gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-88.c | 18 + gcc/testsuite/gcc.dg/uninit-37.c | 154 ++ gcc/testsuite/gcc.dg/vect/bb-slp-48.c | 55 + gcc/testsuite/gcc.dg/vect/bb-slp-49.c | 28 + gcc/testsuite/gcc.dg/vect/bb-slp-7.c | 3 +- gcc/testsuite/gcc.dg/vect/pr37027.c | 2 +- gcc/testsuite/gcc.dg/vect/pr67790.c | 1 + gcc/testsuite/gcc.dg/vect/pr92324-4.c | 2 + gcc/testsuite/gcc.dg/vect/pr92558.c | 2 + gcc/testsuite/gcc.dg/vect/pr95495.c | 2 + gcc/testsuite/gcc.dg/vect/pr97081-2.c | 32 + gcc/testsuite/gcc.dg/vect/pr97081.c | 26 + gcc/testsuite/gcc.dg/vect/pr97085.c | 13 + gcc/testsuite/gcc.dg/vect/pr97139.c | 27 + gcc/testsuite/gcc.dg/vect/pr97173.c | 19 + gcc/testsuite/gcc.dg/vect/pr97236.c | 43 + gcc/testsuite/gcc.dg/vect/pr97241.c | 19 + gcc/testsuite/gcc.dg/vect/slp-reduc-1.c | 2 +- gcc/testsuite/gcc.dg/vect/slp-reduc-2.c | 1 + gcc/testsuite/gcc.dg/vect/slp-reduc-3.c | 1 + gcc/testsuite/gcc.dg/vect/slp-reduc-4.c | 1 + gcc/testsuite/gcc.dg/vect/slp-reduc-5.c | 2 +- gcc/testsuite/gcc.dg/vect/slp-reduc-7.c | 2 +- gcc/testsuite/gcc.dg/vect/vect-reduc-in-order-4.c | 1 + gcc/testsuite/gcc.dg/vect/vect-simd-17.c | 304 +++ gcc/testsuite/gcc.dg/vect/vect-simd-18.c | 40 + gcc/testsuite/gcc.dg/vect/vect-simd-19.c | 40 + gcc/testsuite/gcc.dg/vect/vect-simd-20.c | 43 + gcc/testsuite/gcc.target/aarch64/acle/armv8-r.c | 6 + .../aarch64/advsimd-intrinsics/arm-neon-ref.h | 8 +- .../aarch64/advsimd-intrinsics/vreinterpret_p128.c | 19 + .../aarch64/advsimd-intrinsics/vtrn_half.c | 3 - .../aarch64/advsimd-intrinsics/vuzp_half.c | 3 - .../aarch64/advsimd-intrinsics/vzip_half.c | 3 - gcc/testsuite/gcc.target/aarch64/movtf_1.c | 87 + gcc/testsuite/gcc.target/aarch64/movti_1.c | 87 + gcc/testsuite/gcc.target/aarch64/pr96313.c | 8 + gcc/testsuite/gcc.target/aarch64/pr96968.c | 28 + gcc/testsuite/gcc.target/aarch64/pr97150.c | 14 + .../gcc.target/aarch64/scalar_intrinsics.c | 6 +- .../gcc.target/aarch64/simd/trn_zip_p64_1.c | 44 + .../gcc.target/aarch64/simd/vadd_poly_1.c | 50 + .../gcc.target/aarch64/simd/vceq_poly_1.c | 29 + .../gcc.target/aarch64/simd/vcls_unsigned_1.c | 54 + .../gcc.target/aarch64/simd/vldrq_p128_1.c | 13 + .../gcc.target/aarch64/simd/vrndns_f32_1.c | 13 + .../gcc.target/aarch64/simd/vstrq_p128_1.c | 12 + .../gcc.target/aarch64/stack-protector-3.c | 45 + .../gcc.target/aarch64/stack-protector-4.c | 6 + .../gcc.target/aarch64/stack-protector-5.c | 23 + .../gcc.target/aarch64/stack-protector-6.c | 8 + .../gcc.target/aarch64/stack-protector-7.c | 25 + gcc/testsuite/gcc.target/aarch64/sve/clastb_8.c | 5 +- .../gcc.target/aarch64/sve/cost_model_10.c | 12 + .../gcc.target/aarch64/sve/cost_model_5.c | 4 +- gcc/testsuite/gcc.target/aarch64/sve/pr96915.c | 11 + .../gcc.target/aarch64/sve/struct_vect_14.c | 8 +- .../gcc.target/aarch64/sve/struct_vect_15.c | 8 +- .../gcc.target/aarch64/sve/struct_vect_16.c | 8 +- .../gcc.target/aarch64/sve/struct_vect_17.c | 8 +- .../gcc.target/arm/armv8_1m-fp16-move-1.c | 418 +++++ .../gcc.target/arm/armv8_1m-fp32-move-1.c | 420 +++++ .../gcc.target/arm/armv8_1m-fp64-move-1.c | 426 +++++ .../gcc.target/arm/armv8_2-fp16-arith-2.c | 20 +- gcc/testsuite/gcc.target/arm/csinc-1.c | 24 + gcc/testsuite/gcc.target/arm/csinv-1.c | 24 + gcc/testsuite/gcc.target/arm/csneg.c | 34 + gcc/testsuite/gcc.target/arm/lob1.c | 2 +- gcc/testsuite/gcc.target/arm/lob2.c | 2 +- gcc/testsuite/gcc.target/arm/lob3.c | 2 +- gcc/testsuite/gcc.target/arm/lob4.c | 2 +- gcc/testsuite/gcc.target/arm/lob5.c | 2 +- gcc/testsuite/gcc.target/arm/lob6.c | 2 +- gcc/testsuite/gcc.target/arm/lto/pr96939_0.c | 15 + gcc/testsuite/gcc.target/arm/lto/pr96939_1.c | 10 + .../arm/mve/intrinsics/mve-vldstr16-no-writeback.c | 5 +- .../gcc.target/arm/mve/intrinsics/mve_fp_vaddq_n.c | 47 + .../gcc.target/arm/mve/intrinsics/mve_vaddq_n.c | 31 + .../arm/mve/intrinsics/vaddq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vaddq_m_n_f32-1.c | 12 + .../arm/mve/intrinsics/vaddq_x_n_f16-1.c | 12 + .../arm/mve/intrinsics/vaddq_x_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpeqq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpeqq_m_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpeqq_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpeqq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpgeq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpgeq_m_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpgeq_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpgeq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpgtq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpgtq_m_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpgtq_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpgtq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpleq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpleq_m_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpleq_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpleq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpltq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpltq_m_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpltq_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpltq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpneq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpneq_m_n_f32-1.c | 12 + .../arm/mve/intrinsics/vcmpneq_n_f16-1.c | 12 + .../arm/mve/intrinsics/vcmpneq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vfmaq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vfmaq_m_n_f32-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vfmaq_n_f16-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vfmaq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vfmasq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vfmasq_m_n_f32-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vfmasq_n_f16-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vfmasq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vmaxnmavq_f16-1.c | 12 + .../arm/mve/intrinsics/vmaxnmavq_f32-1.c | 12 + .../arm/mve/intrinsics/vmaxnmavq_p_f16-1.c | 12 + .../arm/mve/intrinsics/vmaxnmavq_p_f32-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vmaxnmvq_f16-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vmaxnmvq_f32-1.c | 12 + .../arm/mve/intrinsics/vmaxnmvq_p_f16-1.c | 12 + .../arm/mve/intrinsics/vmaxnmvq_p_f32-1.c | 12 + .../arm/mve/intrinsics/vminnmavq_f16-1.c | 12 + .../arm/mve/intrinsics/vminnmavq_f32-1.c | 12 + .../arm/mve/intrinsics/vminnmavq_p_f16-1.c | 12 + .../arm/mve/intrinsics/vminnmavq_p_f32-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vminnmvq_f16-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vminnmvq_f32-1.c | 12 + .../arm/mve/intrinsics/vminnmvq_p_f16-1.c | 12 + .../arm/mve/intrinsics/vminnmvq_p_f32-1.c | 12 + .../arm/mve/intrinsics/vmulq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vmulq_m_n_f32-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vmulq_n_f16-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vmulq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vmulq_x_n_f16-1.c | 12 + .../arm/mve/intrinsics/vmulq_x_n_f32-1.c | 12 + .../arm/mve/intrinsics/vsetq_lane_f16-1.c | 13 + .../arm/mve/intrinsics/vsetq_lane_f32-1.c | 13 + .../arm/mve/intrinsics/vsubq_m_n_f16-1.c | 12 + .../arm/mve/intrinsics/vsubq_m_n_f32-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vsubq_n_f16-1.c | 12 + .../gcc.target/arm/mve/intrinsics/vsubq_n_f32-1.c | 12 + .../arm/mve/intrinsics/vsubq_x_n_f16-1.c | 13 + .../arm/mve/intrinsics/vsubq_x_n_f32-1.c | 13 + gcc/testsuite/gcc.target/arm/pr95646.c | 11 +- gcc/testsuite/gcc.target/arm/stack-protector-3.c | 38 + gcc/testsuite/gcc.target/arm/stack-protector-4.c | 6 + gcc/testsuite/gcc.target/arm/stack-protector-5.c | 21 + gcc/testsuite/gcc.target/arm/stack-protector-6.c | 8 + gcc/testsuite/gcc.target/arm/thumb2-cond-cmp-1.c | 2 +- gcc/testsuite/gcc.target/arm/thumb2-cond-cmp-2.c | 2 +- gcc/testsuite/gcc.target/arm/thumb2-cond-cmp-3.c | 2 +- gcc/testsuite/gcc.target/arm/thumb2-cond-cmp-4.c | 2 +- gcc/testsuite/gcc.target/bpf/diag-sdiv.c | 12 + gcc/testsuite/gcc.target/bpf/diag-smod.c | 12 + gcc/testsuite/gcc.target/bpf/nop-1.c | 14 + gcc/testsuite/gcc.target/bpf/xbpf-sdiv-1.c | 14 + gcc/testsuite/gcc.target/bpf/xbpf-smod-1.c | 14 + gcc/testsuite/gcc.target/i386/amx-check.h | 185 ++ gcc/testsuite/gcc.target/i386/amxbf16-asmatt-1.c | 13 + gcc/testsuite/gcc.target/i386/amxbf16-asmintel-1.c | 9 + gcc/testsuite/gcc.target/i386/amxbf16-dpbf16ps-2.c | 85 + gcc/testsuite/gcc.target/i386/amxint8-asmatt-1.c | 19 + gcc/testsuite/gcc.target/i386/amxint8-asmintel-1.c | 15 + gcc/testsuite/gcc.target/i386/amxint8-dpbssd-2.c | 64 + gcc/testsuite/gcc.target/i386/amxint8-dpbsud-2.c | 63 + gcc/testsuite/gcc.target/i386/amxint8-dpbusd-2.c | 63 + gcc/testsuite/gcc.target/i386/amxint8-dpbuud-2.c | 63 + gcc/testsuite/gcc.target/i386/amxtile-2.c | 48 + gcc/testsuite/gcc.target/i386/amxtile-asmatt-1.c | 30 + gcc/testsuite/gcc.target/i386/amxtile-asmintel-1.c | 24 + .../gcc.target/i386/avx512f-broadcast-pr87767-1.c | 1 + .../gcc.target/i386/avx512f-broadcast-pr87767-3.c | 1 + .../gcc.target/i386/avx512f-broadcast-pr87767-5.c | 1 + .../gcc.target/i386/avx512f-broadcast-pr87767-6.c | 2 +- .../gcc.target/i386/avx512f-broadcast-pr87767-7.c | 1 + gcc/testsuite/gcc.target/i386/avx512f-pr97028.c | 18 + .../gcc.target/i386/avx512vl-broadcast-pr87767-1.c | 1 + .../gcc.target/i386/avx512vl-broadcast-pr87767-3.c | 1 + .../gcc.target/i386/avx512vl-broadcast-pr87767-5.c | 1 + gcc/testsuite/gcc.target/i386/funcspec-56.inc | 6 + gcc/testsuite/gcc.target/i386/l_fma_double_1.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_double_2.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_double_3.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_double_4.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_double_5.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_double_6.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_float_1.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_float_2.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_float_3.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_float_4.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_float_5.c | 2 +- gcc/testsuite/gcc.target/i386/l_fma_float_6.c | 2 +- gcc/testsuite/gcc.target/i386/m128-check.h | 1 + gcc/testsuite/gcc.target/i386/movdir64b.c | 23 + gcc/testsuite/gcc.target/i386/movdiri32.c | 20 + gcc/testsuite/gcc.target/i386/movdiri64.c | 20 + gcc/testsuite/gcc.target/i386/pr78904-4a.c | 2 +- gcc/testsuite/gcc.target/i386/pr82673.c | 2 +- gcc/testsuite/gcc.target/i386/pr95021-3.c | 2 +- gcc/testsuite/gcc.target/i386/pr96814.c | 19 + gcc/testsuite/gcc.target/i386/pr96827.c | 41 + gcc/testsuite/gcc.target/i386/pr96861.c | 38 + gcc/testsuite/gcc.target/i386/pr97032.c | 23 + gcc/testsuite/gcc.target/i386/sse-12.c | 2 +- gcc/testsuite/gcc.target/i386/sse-13.c | 2 +- gcc/testsuite/gcc.target/i386/sse-14.c | 2 +- gcc/testsuite/gcc.target/i386/sse-22.c | 5 +- gcc/testsuite/gcc.target/i386/sse-23.c | 3 +- gcc/testsuite/gcc.target/i386/sse2-mmx-pinsrw.c | 8 +- gcc/testsuite/gcc.target/i386/x86-64-v2.c | 116 ++ gcc/testsuite/gcc.target/i386/x86-64-v3-haswell.c | 18 + gcc/testsuite/gcc.target/i386/x86-64-v3-skylake.c | 21 + gcc/testsuite/gcc.target/i386/x86-64-v3.c | 116 ++ gcc/testsuite/gcc.target/i386/x86-64-v4.c | 116 ++ gcc/testsuite/gcc.target/i386/xsave-avx-1.c | 12 + .../gcc.target/msp430/operand-modifiers-bad.c | 15 + .../gcc.target/msp430/operand-modifiers.c | 167 +- gcc/testsuite/gcc.target/nvptx/int128.c | 15 + .../gcc.target/powerpc/p9-vec-length-epil-1.c | 4 +- .../gcc.target/powerpc/p9-vec-length-epil-7.c | 2 +- .../gcc.target/powerpc/p9-vec-length-epil-8.c | 4 +- .../gcc.target/powerpc/p9-vec-length-full-6.c | 9 +- gcc/testsuite/gcc.target/powerpc/pr96139-a.c | 4 +- gcc/testsuite/gcc.target/powerpc/pr96139-b.c | 4 +- gcc/testsuite/gcc.target/powerpc/pr96139-c.c | 2 +- gcc/testsuite/gcc.target/powerpc/pr97019.c | 83 + gcc/testsuite/gcc.target/powerpc/sse4_1-pinsrb.c | 110 ++ gcc/testsuite/gcc.target/powerpc/sse4_1-pinsrd.c | 73 + gcc/testsuite/gcc.target/powerpc/sse4_1-pinsrq.c | 67 + gcc/testsuite/gcc.target/riscv/predef-3.c | 6 +- gcc/testsuite/gcc.target/riscv/predef-6.c | 6 +- gcc/testsuite/gcc.target/riscv/shorten-memrefs-8.c | 27 + gcc/testsuite/gcc.target/s390/load-and-test-fp-1.c | 21 +- gcc/testsuite/gcc.target/s390/load-and-test-fp-2.c | 17 +- gcc/testsuite/gcc.target/s390/load-and-test-fp.h | 12 + gcc/testsuite/gdc.dg/Waddress.d | 12 + gcc/testsuite/gdc.dg/Wcastresult1.d | 18 + gcc/testsuite/gdc.dg/Wcastresult2.d | 12 + gcc/testsuite/gdc.dg/pr97002.d | 55 + gcc/testsuite/gfortran.dg/alloc_comp_result_2.f90 | 3 +- gcc/testsuite/gfortran.dg/alloc_comp_result_3.f90 | 75 + gcc/testsuite/gfortran.dg/check_bits_2.f90 | 38 + gcc/testsuite/gfortran.dg/contiguous_11.f90 | 45 + gcc/testsuite/gfortran.dg/contiguous_4.f90 | 6 +- gcc/testsuite/gfortran.dg/contiguous_7.f90 | 16 +- gcc/testsuite/gfortran.dg/gomp/openmp-simd-6.f90 | 62 + gcc/testsuite/gfortran.dg/pr97036.f90 | 27 + gcc/testsuite/gfortran.dg/pr97095.f | 27 + gcc/testsuite/gfortran.dg/select_type_50.f90 | 52 + gcc/testsuite/gnat.dg/addr16.adb | 14 + gcc/testsuite/gnat.dg/addr16_pkg.ads | 9 + gcc/testsuite/gnat.dg/concat4.adb | 17 + gcc/testsuite/gnat.dg/discr59.adb | 24 + gcc/testsuite/gnat.dg/discr59_pkg1.ads | 35 + gcc/testsuite/gnat.dg/discr59_pkg2.ads | 15 + gcc/testsuite/gnat.dg/pack27.adb | 10 + gcc/testsuite/gnat.dg/pack27_pkg.ads | 33 + gcc/testsuite/gnat.dg/specs/discr7.ads | 14 + gcc/testsuite/gnat.dg/specs/size_clause5.ads | 16 + gcc/testsuite/gnat.dg/thunk1.adb | 9 + gcc/testsuite/gnat.dg/thunk1_pkg1.ads | 7 + gcc/testsuite/gnat.dg/thunk1_pkg2.adb | 10 + gcc/testsuite/gnat.dg/thunk1_pkg2.ads | 14 + gcc/testsuite/go.test/test/fixedbugs/issue4458.go | 2 +- gcc/testsuite/jit.dg/all-non-failing-tests.h | 7 + gcc/testsuite/jit.dg/test-global-set-initializer.c | 78 + gcc/testsuite/lib/target-supports.exp | 77 +- gcc/testsuite/obj-c++.dg/syntax-error-9.mm | 2 +- gcc/timevar.c | 8 +- gcc/timevar.def | 2 + gcc/toplev.c | 10 +- gcc/tree-eh.c | 18 +- gcc/tree-if-conv.c | 107 +- gcc/tree-pass.h | 2 + gcc/tree-predcom.c | 3 +- gcc/tree-pretty-print.c | 4 +- gcc/tree-ssa-alias.c | 200 +- gcc/tree-ssa-alias.h | 2 +- gcc/tree-ssa-ccp.c | 22 +- gcc/tree-ssa-copy.c | 27 +- gcc/tree-ssa-loop-ch.c | 3 +- gcc/tree-ssa-loop-im.c | 11 +- gcc/tree-ssa-loop-ivcanon.c | 9 +- gcc/tree-ssa-loop-manip.c | 3 +- gcc/tree-ssa-loop-niter.c | 20 +- gcc/tree-ssa-loop-prefetch.c | 7 +- gcc/tree-ssa-math-opts.c | 8 +- gcc/tree-ssa-propagate.c | 15 +- gcc/tree-ssa-propagate.h | 2 - gcc/tree-ssa-reassoc.c | 2 +- gcc/tree-ssa-sccvn.c | 38 + gcc/tree-ssa-strlen.c | 14 +- gcc/tree-ssa-structalias.c | 2 + gcc/tree-ssa-uninit.c | 66 +- gcc/tree-streamer-in.c | 9 +- gcc/tree-switch-conversion.c | 40 +- gcc/tree-switch-conversion.h | 7 +- gcc/tree-vect-data-refs.c | 5 + gcc/tree-vect-loop-manip.c | 83 +- gcc/tree-vect-loop.c | 298 +-- gcc/tree-vect-patterns.c | 11 +- gcc/tree-vect-slp.c | 393 ++-- gcc/tree-vect-stmts.c | 20 +- gcc/tree-vectorizer.c | 10 +- gcc/tree-vectorizer.h | 16 +- gcc/tree.c | 16 +- gcc/tree.h | 15 +- gcc/value-prof.c | 5 +- gcc/value-query.cc | 1 + gcc/value-query.h | 59 +- gcc/value-range.cc | 19 +- gcc/value-range.h | 36 +- gcc/varpool.c | 2 +- gcc/vec.h | 13 + include/ChangeLog | 14 + include/dwarf2.def | 11 + include/dwarf2.h | 25 +- include/gomp-constants.h | 3 + libatomic/ChangeLog | 12 + libatomic/config/nvptx/host-config.h | 56 + libatomic/config/nvptx/lock.c | 56 + libatomic/config/t-aix | 5 +- libatomic/configure.tgt | 3 + libatomic/libatomic_i.h | 2 + libbacktrace/ChangeLog | 130 ++ libbacktrace/Makefile.am | 107 +- libbacktrace/Makefile.in | 189 +- libbacktrace/config.h.in | 3 + libbacktrace/configure | 242 ++- libbacktrace/configure.ac | 17 +- libbacktrace/dwarf.c | 38 +- libbacktrace/elf.c | 1740 +++++++++++++++-- libbacktrace/fileline.c | 27 + libbacktrace/internal.h | 34 + libbacktrace/macho.c | 6 + libbacktrace/mtest.c | 410 ++++ libbacktrace/xztest.c | 508 +++++ libcc1/ChangeLog | 19 + libcc1/libcp1plugin.cc | 20 +- libcpp/ChangeLog | 12 + libcpp/include/line-map.h | 6 + libcpp/lex.c | 4 +- libcpp/line-map.c | 2 +- libffi/ChangeLog | 12 + libffi/src/powerpc/linux64.S | 8 + libffi/src/powerpc/linux64_closure.S | 16 +- libgcc/ChangeLog | 38 + libgcc/config.host | 2 +- libgcc/config/aarch64/aarch64-unwind.h | 3 +- libgcc/config/aarch64/libgcc-softfp.ver | 28 + libgcc/config/aarch64/t-softfp | 1 + libgcc/config/arm/fp16.c | 10 +- libgcc/config/riscv/t-elf | 2 + libgcc/config/rs6000/morestack.S | 30 +- libgcc/config/rs6000/t-linux | 7 +- libgcc/config/rs6000/t-slibgcc-aix | 21 +- libgcc/config/rs6000/tramp.S | 6 + libgcc/libgcov-driver.c | 2 +- libgfortran/ChangeLog | 23 + libgfortran/config/t-aix | 9 +- libgfortran/generated/unpack_c10.c | 8 +- libgfortran/generated/unpack_c16.c | 8 +- libgfortran/generated/unpack_c4.c | 8 +- libgfortran/generated/unpack_c8.c | 8 +- libgfortran/generated/unpack_i1.c | 8 +- libgfortran/generated/unpack_i16.c | 8 +- libgfortran/generated/unpack_i2.c | 8 +- libgfortran/generated/unpack_i4.c | 8 +- libgfortran/generated/unpack_i8.c | 8 +- libgfortran/generated/unpack_r10.c | 8 +- libgfortran/generated/unpack_r16.c | 8 +- libgfortran/generated/unpack_r4.c | 8 +- libgfortran/generated/unpack_r8.c | 8 +- libgfortran/m4/unpack.m4 | 8 +- libgo/MERGE | 2 +- libgo/Makefile.am | 2 +- libgo/Makefile.in | 2 +- libgo/VERSION | 2 +- libgo/configure | 17 +- libgo/configure.ac | 10 +- libgo/go/cmd/cgo/main.go | 2 + libgo/go/cmd/go/internal/test/test.go | 8 +- libgo/go/cmd/go/internal/test/testflag.go | 29 +- .../go/testdata/script/link_syso_issue33139.txt | 3 +- libgo/go/cmd/go/testdata/script/test_flags.txt | 132 ++ libgo/go/cmd/internal/sys/arch.go | 11 + libgo/go/cmd/internal/test2json/test2json.go | 65 +- .../internal/test2json/testdata/benchshort.json | 1 - .../go/cmd/internal/test2json/testdata/empty.json | 0 .../go/cmd/internal/test2json/testdata/empty.test | 0 .../internal/test2json/testdata/issue29755.json | 38 + .../internal/test2json/testdata/issue29755.test | 27 + .../go/cmd/internal/test2json/testdata/panic.json | 19 + .../go/cmd/internal/test2json/testdata/panic.test | 17 + .../go/cmd/internal/test2json/testdata/smiley.json | 22 +- .../go/cmd/internal/test2json/testdata/smiley.test | 22 +- libgo/go/cmd/internal/test2json/testdata/vet.json | 22 +- libgo/go/cmd/internal/test2json/testdata/vet.test | 22 +- libgo/go/cmd/test2json/main.go | 6 +- libgo/go/debug/elf/file.go | 43 + libgo/go/go/internal/gccgoimporter/importer.go | 2 +- libgo/go/go/types/sizes.go | 4 +- libgo/go/golang.org/x/sys/cpu/cpu_riscv.go | 7 + .../x/tools/go/analysis/passes/asmdecl/asmdecl.go | 2 + libgo/go/internal/bytealg/indexbyte_generic.go | 2 +- libgo/go/internal/bytealg/indexbyte_native.go | 2 +- libgo/go/internal/cpu/cpu_no_init.go | 1 + .../go/internal/cpu/{cpu_ppc64x.go => cpu_ppcx.go} | 2 +- libgo/go/internal/poll/copy_file_range_linux.go | 10 +- .../internal/syscall/unix/sysnum_linux_generic.go | 2 +- libgo/go/net/fd_posix.go | 2 +- libgo/go/net/http/cgi/child.go | 36 +- libgo/go/net/http/cgi/child_test.go | 69 + libgo/go/net/http/cgi/integration_test.go | 53 +- libgo/go/net/http/fcgi/child.go | 39 +- libgo/go/net/http/fcgi/fcgi_test.go | 53 + libgo/go/net/interface_aix.go | 2 - libgo/go/net/mail/message.go | 13 +- libgo/go/net/mail/message_test.go | 32 + libgo/go/runtime/checkptr_test.go | 1 + libgo/go/runtime/gcinfo_test.go | 2 +- libgo/go/runtime/hash32.go | 2 +- libgo/go/runtime/lfstack_32bit.go | 2 +- libgo/go/runtime/lockrank_off.go | 10 + libgo/go/runtime/mkpreempt.go | 6 + libgo/go/runtime/mpagealloc_32bit.go | 2 +- libgo/go/runtime/os_aix.go | 11 +- libgo/go/runtime/testdata/testprog/checkptr.go | 8 + libgo/go/sync/map.go | 1 + libgo/go/sync/map_test.go | 24 + libgo/go/syscall/endian_little.go | 2 +- libgo/go/syscall/export_aix_test.go | 16 + libgo/go/syscall/export_unix_test.go | 2 +- libgo/go/syscall/libcall_aix.go | 3 - libgo/go/syscall/libcall_glibc.go | 2 +- libgo/go/syscall/libcall_linux.go | 2 +- libgo/go/syscall/syscall_aix_ppc.go | 3 + libgo/go/testing/testing.go | 29 +- libgo/match.sh | 4 +- libgo/merge.sh | 4 +- libgo/misc/cgo/testcshared/testdata/libgo2/dup2.go | 2 +- libgo/misc/cgo/testcshared/testdata/libgo2/dup3.go | 2 +- libgo/mksysinfo.sh | 9 +- libgo/runtime/go-varargs.c | 18 + libgo/sysinfo.c | 10 + libgo/testsuite/gotest | 4 +- libgomp/ChangeLog | 77 + libgomp/config/gcn/bar.c | 15 +- libgomp/config/nvptx/atomic.c | 18 + libgomp/config/nvptx/bar.c | 18 +- libgomp/config/t-aix | 5 +- libgomp/libgomp.h | 3 + libgomp/parallel.c | 9 +- libgomp/plugin/plugin-nvptx.c | 1 + libgomp/target.c | 184 +- libgomp/testsuite/libgomp.c++/pr96390.C | 49 + libgomp/testsuite/libgomp.c++/udr-3.C | 1 + .../nested-parallel-unbalanced.c | 31 + libgomp/testsuite/libgomp.c-c++-common/pr96390.c | 26 + .../testsuite/libgomp.c-c++-common/reduction-16.c | 1 + libgomp/testsuite/libgomp.c/loop-25.c | 296 +++ .../testsuite/libgomp.fortran/declare-target-3.f90 | 45 + .../testsuite/libgomp.fortran/map-alloc-ptr-1.f90 | 114 ++ .../testsuite/libgomp.fortran/map-alloc-ptr-2.f90 | 86 + libgomp/testsuite/libgomp.fortran/pr66199-5.f90 | 2 +- libiberty/ChangeLog | 5 + libiberty/dwarfnames.c | 7 + libitm/config/powerpc/sjlj.S | 18 +- libphobos/ChangeLog | 22 + libphobos/Makefile.am | 10 +- libphobos/Makefile.in | 12 +- libphobos/configure | 15 +- libphobos/configure.ac | 8 +- libphobos/libdruntime/Makefile.am | 6 +- libphobos/libdruntime/Makefile.in | 8 +- libphobos/libdruntime/core/thread.d | 43 +- libphobos/libdruntime/gcc/config.d.in | 3 - libphobos/src/Makefile.am | 5 +- libphobos/src/Makefile.in | 7 +- libphobos/testsuite/Makefile.in | 2 +- libphobos/testsuite/testsuite_flags.in | 2 +- libsanitizer/ChangeLog | 7 + libsanitizer/libbacktrace/backtrace-rename.h | 3 + libstdc++-v3/ChangeLog | 453 +++++ libstdc++-v3/config/abi/pre/gnu.ver | 10 +- libstdc++-v3/config/cpu/arm/cxxabi_tweaks.h | 7 +- libstdc++-v3/config/os/aix/t-aix | 12 +- libstdc++-v3/doc/html/manual/configure.html | 3 +- libstdc++-v3/doc/html/manual/status.html | 4 +- libstdc++-v3/doc/xml/manual/configure.xml | 3 +- libstdc++-v3/include/Makefile.am | 5 +- libstdc++-v3/include/Makefile.in | 5 +- libstdc++-v3/include/bits/align.h | 110 ++ libstdc++-v3/include/bits/atomic_base.h | 66 +- libstdc++-v3/include/bits/atomic_futex.h | 93 +- libstdc++-v3/include/bits/c++config | 11 +- libstdc++-v3/include/bits/codecvt.h | 4 +- libstdc++-v3/include/bits/fs_path.h | 2 +- libstdc++-v3/include/bits/iterator_concepts.h | 2 +- libstdc++-v3/include/bits/locale_conv.h | 4 +- libstdc++-v3/include/bits/locale_facets_nonio.tcc | 14 +- libstdc++-v3/include/bits/range_access.h | 827 +------- libstdc++-v3/include/bits/ranges_algo.h | 1 + libstdc++-v3/include/bits/ranges_algobase.h | 6 +- libstdc++-v3/include/bits/ranges_base.h | 887 +++++++++ .../include/bits/{range_cmp.h => ranges_cmp.h} | 8 +- libstdc++-v3/include/bits/ranges_util.h | 417 +++++ libstdc++-v3/include/bits/regex_error.h | 4 +- libstdc++-v3/include/bits/stl_algo.h | 5 + libstdc++-v3/include/bits/stl_iterator.h | 20 +- libstdc++-v3/include/c_global/cmath | 4 +- .../include/experimental/bits/shared_ptr.h | 6 + libstdc++-v3/include/experimental/string_view | 1 + libstdc++-v3/include/experimental/type_traits | 2 +- libstdc++-v3/include/ext/atomicity.h | 35 +- libstdc++-v3/include/ext/new_allocator.h | 2 +- libstdc++-v3/include/std/chrono | 28 +- libstdc++-v3/include/std/condition_variable | 21 +- libstdc++-v3/include/std/functional | 6 +- libstdc++-v3/include/std/memory | 60 +- libstdc++-v3/include/std/memory_resource | 6 +- libstdc++-v3/include/std/ranges | 553 ++---- libstdc++-v3/include/std/span | 5 +- libstdc++-v3/include/std/string_view | 1 + libstdc++-v3/include/std/tuple | 2 +- libstdc++-v3/include/std/type_traits | 29 +- libstdc++-v3/include/std/version | 10 +- libstdc++-v3/libsupc++/Makefile.am | 22 - libstdc++-v3/libsupc++/Makefile.in | 22 - libstdc++-v3/libsupc++/eh_call.cc | 4 +- libstdc++-v3/libsupc++/guard.cc | 47 +- libstdc++-v3/src/c++11/futex.cc | 119 ++ libstdc++-v3/src/c++17/fs_path.cc | 2 +- libstdc++-v3/src/c++17/memory_resource.cc | 177 +- libstdc++-v3/testsuite/18_support/96817.cc | 39 + libstdc++-v3/testsuite/20_util/align/3.cc | 53 + libstdc++-v3/testsuite/20_util/assume_aligned/1.cc | 23 +- .../testsuite/20_util/assume_aligned/97132.cc | 34 + .../20_util/function_objects/bind_front/97101.cc | 41 + .../20_util/invoke_result/incomplete_args_neg.cc | 47 + .../20_util/is_invocable/incomplete_args_neg.cc | 70 + .../20_util/is_invocable/incomplete_neg.cc | 39 + .../is_nothrow_invocable/incomplete_args_neg.cc | 70 + .../20_util/is_nothrow_invocable/incomplete_neg.cc | 6 + .../20_util/monotonic_buffer_resource/allocate.cc | 46 + libstdc++-v3/testsuite/20_util/tuple/cons/96803.cc | 21 + .../unsynchronized_pool_resource/allocate.cc | 84 +- .../testsuite/23_containers/span/back_neg.cc | 14 +- .../testsuite/23_containers/span/front_neg.cc | 14 +- .../testsuite/23_containers/span/index_op_neg.cc | 14 +- .../24_iterators/back_insert_iterator/pr93884.cc | 1 + .../24_iterators/front_insert_iterator/pr93884.cc | 1 + .../testsuite/25_algorithms/for_each/constexpr.cc | 12 + libstdc++-v3/testsuite/25_algorithms/sample/3.cc | 50 + .../testsuite/25_algorithms/search/constexpr.cc | 4 + .../27_io/filesystem/path/append/source.cc | 10 + libstdc++-v3/testsuite/30_threads/async/async.cc | 118 ++ .../30_threads/condition_variable/members/68519.cc | 61 +- .../std/ranges/adaptors/detail/semiregular_box.cc | 73 + libstdc++-v3/testsuite/std/ranges/adaptors/drop.cc | 128 +- .../testsuite/std/ranges/adaptors/elements.cc | 24 + .../testsuite/std/ranges/adaptors/sizeof.cc | 52 + .../testsuite/std/ranges/adaptors/transform.cc | 24 + .../testsuite/std/ranges/iota/iota_view.cc | 3 + .../testsuite/std/ranges/subrange/sizeof.cc | 28 + lto-plugin/ChangeLog | 5 + 1132 files changed, 43367 insertions(+), 8175 deletions(-) diff --cc gcc/gimple-range-cache.cc index 112671c8a87,00000000000..40383626678 mode 100644,000000..100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@@ -1,877 -1,0 +1,877 @@@ +/* Gimple ranger SSA cache implementation. + Copyright (C) 2017-2020 Free Software Foundation, Inc. + Contributed by Andrew MacLeod . + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "backend.h" +#include "insn-codes.h" +#include "tree.h" +#include "gimple.h" +#include "ssa.h" +#include "gimple-pretty-print.h" +#include "gimple-range.h" + +// During contructor, allocate the vector of ssa_names. + +non_null_ref::non_null_ref () +{ + m_nn.create (0); + m_nn.safe_grow_cleared (num_ssa_names); + bitmap_obstack_initialize (&m_bitmaps); +} + +// Free any bitmaps which were allocated,a swell as the vector itself. + +non_null_ref::~non_null_ref () +{ + bitmap_obstack_release (&m_bitmaps); + m_nn.release (); +} + +// Return true if NAME has a non-null dereference in block bb. If this is the +// first query for NAME, calculate the summary first. + +bool +non_null_ref::non_null_deref_p (tree name, basic_block bb) +{ + if (!POINTER_TYPE_P (TREE_TYPE (name))) + return false; + + unsigned v = SSA_NAME_VERSION (name); + if (!m_nn[v]) + process_name (name); + + return bitmap_bit_p (m_nn[v], bb->index); +} + +// Allocate an populate the bitmap for NAME. An ON bit for a block +// index indicates there is a non-null reference in that block. In +// order to populate the bitmap, a quick run of all the immediate uses +// are made and the statement checked to see if a non-null dereference +// is made on that statement. + +void +non_null_ref::process_name (tree name) +{ + unsigned v = SSA_NAME_VERSION (name); + use_operand_p use_p; + imm_use_iterator iter; + bitmap b; + + // Only tracked for pointers. + if (!POINTER_TYPE_P (TREE_TYPE (name))) + return; + + // Already processed if a bitmap has been allocated. + if (m_nn[v]) + return; + + b = BITMAP_ALLOC (&m_bitmaps); + + // Loop over each immediate use and see if it implies a non-null value. + FOR_EACH_IMM_USE_FAST (use_p, iter, name) + { + gimple *s = USE_STMT (use_p); + unsigned index = gimple_bb (s)->index; + tree value; + enum tree_code comp_code; + + // If bit is already set for this block, dont bother looking again. + if (bitmap_bit_p (b, index)) + continue; + + // If we can infer a != 0 range, then set the bit for this BB + if (infer_value_range (s, name, &comp_code, &value)) + { + if (comp_code == NE_EXPR && integer_zerop (value)) + bitmap_set_bit (b, index); + } + } + + m_nn[v] = b; +} + +// ------------------------------------------------------------------------- + +// This class implements a cache of ranges indexed by basic block. It +// represents all that is known about an SSA_NAME on entry to each +// block. It caches a range-for-type varying range so it doesn't need +// to be reformed all the time. If a range is ever always associated +// with a type, we can use that instead. Whenever varying is being +// set for a block, the cache simply points to this cached one rather +// than create a new one each time. + +class ssa_block_ranges +{ +public: - ssa_block_ranges (tree t, irange_pool *pool); ++ ssa_block_ranges (tree t, irange_allocator *); + ~ssa_block_ranges (); + + void set_bb_range (const basic_block bb, const irange &r); + void set_bb_varying (const basic_block bb); + bool get_bb_range (irange &r, const basic_block bb); + bool bb_range_p (const basic_block bb); + + void dump(FILE *f); +private: + vec m_tab; + irange *m_type_range; + tree m_type; - irange_pool *m_irange_pool; ++ irange_allocator *m_irange_allocator; +}; + + +// Initialize a block cache for an ssa_name of type T. + - ssa_block_ranges::ssa_block_ranges (tree t, irange_pool *pool) ++ssa_block_ranges::ssa_block_ranges (tree t, irange_allocator *allocator) +{ + gcc_checking_assert (TYPE_P (t)); + m_type = t; - m_irange_pool = pool; ++ m_irange_allocator = allocator; + + m_tab.create (0); + m_tab.safe_grow_cleared (last_basic_block_for_fn (cfun)); + + // Create the cached type range. - m_type_range = m_irange_pool->allocate (2); ++ m_type_range = m_irange_allocator->allocate (2); + m_type_range->set_varying (t); + + m_tab[ENTRY_BLOCK_PTR_FOR_FN (cfun)->index] = m_type_range; +} + +// Destruct block range. + +ssa_block_ranges::~ssa_block_ranges () +{ + m_tab.release (); +} + +// Set the range for block BB to be R. + +void +ssa_block_ranges::set_bb_range (const basic_block bb, const irange &r) +{ - irange *m = m_irange_pool->allocate (r); ++ irange *m = m_irange_allocator->allocate (r); + m_tab[bb->index] = m; +} + +// Set the range for block BB to the range for the type. + +void +ssa_block_ranges::set_bb_varying (const basic_block bb) +{ + m_tab[bb->index] = m_type_range; +} + +// Return the range associated with block BB in R. Return false if +// there is no range. + +bool +ssa_block_ranges::get_bb_range (irange &r, const basic_block bb) +{ + irange *m = m_tab[bb->index]; + if (m) + { + r = *m; + return true; + } + return false; +} + +// Return true if a range is present. + +bool +ssa_block_ranges::bb_range_p (const basic_block bb) +{ + return m_tab[bb->index] != NULL; +} + + +// Print the list of known ranges for file F in a nice format. + +void +ssa_block_ranges::dump (FILE *f) +{ + basic_block bb; + int_range_max r; + + FOR_EACH_BB_FN (bb, cfun) + if (get_bb_range (r, bb)) + { + fprintf (f, "BB%d -> ", bb->index); + r.dump (f); + fprintf (f, "\n"); + } +} + +// ------------------------------------------------------------------------- + +// Initialize the block cache. + +block_range_cache::block_range_cache () +{ + m_ssa_ranges.create (0); + m_ssa_ranges.safe_grow_cleared (num_ssa_names); - m_irange_pool = new irange_pool; ++ m_irange_allocator = new irange_allocator; +} + +// Remove any m_block_caches which have been created. + +block_range_cache::~block_range_cache () +{ + unsigned x; + for (x = 0; x < m_ssa_ranges.length (); ++x) + { + if (m_ssa_ranges[x]) + delete m_ssa_ranges[x]; + } - delete m_irange_pool; ++ delete m_irange_allocator; + // Release the vector itself. + m_ssa_ranges.release (); +} + +// Return a reference to the m_block_cache for NAME. If it has not been +// accessed yet, allocate it. + +ssa_block_ranges & +block_range_cache::get_block_ranges (tree name) +{ + unsigned v = SSA_NAME_VERSION (name); + if (v >= m_ssa_ranges.length ()) + m_ssa_ranges.safe_grow_cleared (num_ssa_names + 1); + + if (!m_ssa_ranges[v]) - m_ssa_ranges[v] = new ssa_block_ranges (TREE_TYPE (name), m_irange_pool); ++ m_ssa_ranges[v] = new ssa_block_ranges (TREE_TYPE (name), m_irange_allocator); + + return *(m_ssa_ranges[v]); +} + +// Set the range for NAME on entry to block BB to R. + +void +block_range_cache::set_bb_range (tree name, const basic_block bb, + const irange &r) +{ + return get_block_ranges (name).set_bb_range (bb, r); +} + +// Set the range for NAME on entry to block BB to varying. + +void +block_range_cache::set_bb_varying (tree name, const basic_block bb) +{ + return get_block_ranges (name).set_bb_varying (bb); +} + +// Return the range for NAME on entry to BB in R. Return true if there +// is one. + +bool +block_range_cache::get_bb_range (irange &r, tree name, const basic_block bb) +{ + return get_block_ranges (name).get_bb_range (r, bb); +} + +// Return true if NAME has a range set in block BB. + +bool +block_range_cache::bb_range_p (tree name, const basic_block bb) +{ + return get_block_ranges (name).bb_range_p (bb); +} + +// Print all known block caches to file F. + +void +block_range_cache::dump (FILE *f) +{ + unsigned x; + for (x = 0; x < m_ssa_ranges.length (); ++x) + { + if (m_ssa_ranges[x]) + { + fprintf (f, " Ranges for "); + print_generic_expr (f, ssa_name (x), TDF_NONE); + fprintf (f, ":\n"); + m_ssa_ranges[x]->dump (f); + fprintf (f, "\n"); + } + } +} + +// Print all known ranges on entry to blobk BB to file F. + +void +block_range_cache::dump (FILE *f, basic_block bb, bool print_varying) +{ + unsigned x; + int_range_max r; + bool summarize_varying = false; + for (x = 1; x < m_ssa_ranges.length (); ++x) + { + if (!gimple_range_ssa_p (ssa_name (x))) + continue; + if (m_ssa_ranges[x] && m_ssa_ranges[x]->get_bb_range (r, bb)) + { + if (!print_varying && r.varying_p ()) + { + summarize_varying = true; + continue; + } + print_generic_expr (f, ssa_name (x), TDF_NONE); + fprintf (f, "\t"); + r.dump(f); + fprintf (f, "\n"); + } + } + // If there were any varying entries, lump them all together. + if (summarize_varying) + { + fprintf (f, "VARYING_P on entry : "); + for (x = 1; x < num_ssa_names; ++x) + { + if (!gimple_range_ssa_p (ssa_name (x))) + continue; + if (m_ssa_ranges[x] && m_ssa_ranges[x]->get_bb_range (r, bb)) + { + if (r.varying_p ()) + { + print_generic_expr (f, ssa_name (x), TDF_NONE); + fprintf (f, " "); + } + } + } + fprintf (f, "\n"); + } +} + +// ------------------------------------------------------------------------- + +// Initialize a global cache. + +ssa_global_cache::ssa_global_cache () +{ + m_tab.create (0); + m_tab.safe_grow_cleared (num_ssa_names); - m_irange_pool = new irange_pool; ++ m_irange_allocator = new irange_allocator; +} + +// Deconstruct a global cache. + +ssa_global_cache::~ssa_global_cache () +{ + m_tab.release (); - delete m_irange_pool; ++ delete m_irange_allocator; +} + +// Retrieve the global range of NAME from cache memory if it exists. +// Return the value in R. + +bool +ssa_global_cache::get_global_range (irange &r, tree name) const +{ + unsigned v = SSA_NAME_VERSION (name); + if (v >= m_tab.length ()) + return false; + + irange *stow = m_tab[v]; + if (!stow) + return false; + r = *stow; + return true; +} + +// Set the range for NAME to R in the global cache. + +void +ssa_global_cache::set_global_range (tree name, const irange &r) +{ + unsigned v = SSA_NAME_VERSION (name); + if (v >= m_tab.length ()) + m_tab.safe_grow_cleared (num_ssa_names + 1); + + irange *m = m_tab[v]; + if (m && m->fits_p (r)) + *m = r; + else - m_tab[v] = m_irange_pool->allocate (r); ++ m_tab[v] = m_irange_allocator->allocate (r); +} + +// Set the range for NAME to R in the glonbal cache. + +void +ssa_global_cache::clear_global_range (tree name) +{ + unsigned v = SSA_NAME_VERSION (name); + if (v >= m_tab.length ()) + m_tab.safe_grow_cleared (num_ssa_names + 1); + m_tab[v] = NULL; +} + +// Clear the global cache. + +void +ssa_global_cache::clear () +{ + memset (m_tab.address(), 0, m_tab.length () * sizeof (irange *)); +} + +// Dump the contents of the global cache to F. + +void +ssa_global_cache::dump (FILE *f) +{ + unsigned x; + int_range_max r; + fprintf (f, "Non-varying global ranges:\n"); + fprintf (f, "=========================:\n"); + for ( x = 1; x < num_ssa_names; x++) + if (gimple_range_ssa_p (ssa_name (x)) && + get_global_range (r, ssa_name (x)) && !r.varying_p ()) + { + print_generic_expr (f, ssa_name (x), TDF_NONE); + fprintf (f, " : "); + r.dump (f); + fprintf (f, "\n"); + } + fputc ('\n', f); +} + +// -------------------------------------------------------------------------- + +ranger_cache::ranger_cache (range_query &q) : query (q) +{ + m_workback.create (0); + m_workback.safe_grow_cleared (last_basic_block_for_fn (cfun)); + m_update_list.create (0); + m_update_list.safe_grow_cleared (last_basic_block_for_fn (cfun)); + m_update_list.truncate (0); + m_poor_value_list.create (0); + m_poor_value_list.safe_grow_cleared (20); + m_poor_value_list.truncate (0); +} + +ranger_cache::~ranger_cache () +{ + m_poor_value_list.release (); + m_workback.release (); + m_update_list.release (); +} + +// Push a request for a new lookup in block BB of name. Return true if +// the request is actually made (ie, isn't a duplicate). + +bool +ranger_cache::push_poor_value (basic_block bb, tree name) +{ + if (m_poor_value_list.length ()) + { + // Don't push anything else to the same block. If there are multiple + // things required, another request will come during a later evaluation + // and this prevents oscillation building uneccessary depth. + if ((m_poor_value_list.last ()).bb == bb) + return false; + } + + struct update_record rec; + rec.bb = bb; + rec.calc = name; + m_poor_value_list.safe_push (rec); + return true; +} + +// Provide lookup for the gori-computes class to access the best known range +// of an ssa_name in any given basic block. Note, this does no additonal +// lookups, just accesses the data that is already known. + +void +ranger_cache::ssa_range_in_bb (irange &r, tree name, basic_block bb) +{ + gimple *s = SSA_NAME_DEF_STMT (name); + basic_block def_bb = ((s && gimple_bb (s)) ? gimple_bb (s) : + ENTRY_BLOCK_PTR_FOR_FN (cfun)); + if (bb == def_bb) + { + // NAME is defined in this block, so request its current value + if (!m_globals.get_global_range (r, name)) + { + // If it doesn't have a value calculated, it means it's a + // "poor" value being used in some calculation. Queue it up + // as a poor value to be improved later. + r = gimple_range_global (name); + if (push_poor_value (bb, name)) + { + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, + "*CACHE* no global def in bb %d for ", bb->index); + print_generic_expr (dump_file, name, TDF_SLIM); + fprintf (dump_file, " depth : %d\n", + m_poor_value_list.length ()); + } + } + } + } + // Look for the on-entry value of name in BB from the cache. + else if (!m_on_entry.get_bb_range (r, name, bb)) + { + // If it has no entry then mark this as a poor value. + if (push_poor_value (bb, name)) + { + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, + "*CACHE* no on entry range in bb %d for ", bb->index); + print_generic_expr (dump_file, name, TDF_SLIM); + fprintf (dump_file, " depth : %d\n", m_poor_value_list.length ()); + } + } + // Try to pick up any known global value as a best guess for now. + if (!m_globals.get_global_range (r, name)) + r = gimple_range_global (name); + } + + // Check if pointers have any non-null dereferences. Non-call + // exceptions mean we could throw in the middle of the block, so just + // punt for now on those. + if (r.varying_p () && m_non_null.non_null_deref_p (name, bb) && + !cfun->can_throw_non_call_exceptions) + r = range_nonzero (TREE_TYPE (name)); +} + +// Return a static range for NAME on entry to basic block BB in R. If +// calc is true, fill any cache entries required between BB and the +// def block for NAME. Otherwise, return false if the cache is empty. + +bool +ranger_cache::block_range (irange &r, basic_block bb, tree name, bool calc) +{ + gcc_checking_assert (gimple_range_ssa_p (name)); + + if (calc) + { + gimple *def_stmt = SSA_NAME_DEF_STMT (name); + basic_block def_bb = NULL; + if (def_stmt) + def_bb = gimple_bb (def_stmt);; + if (!def_bb) + { + // If we get to the entry block, this better be a default def + // or range_on_entry was called for a block not dominated by + // the def. + gcc_checking_assert (SSA_NAME_IS_DEFAULT_DEF (name)); + def_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun); + } + + // There is no range on entry for the definition block. + if (def_bb == bb) + return false; + + // Otherwise, go figure out what is known in predecessor blocks. + fill_block_cache (name, bb, def_bb); + gcc_checking_assert (m_on_entry.bb_range_p (name, bb)); + } + return m_on_entry.get_bb_range (r, name, bb); +} + +// Add BB to the list of blocks to update, unless it's already in the list. + +void +ranger_cache::add_to_update (basic_block bb) +{ + if (!m_update_list.contains (bb)) + m_update_list.quick_push (bb); +} + +// If there is anything in the iterative update_list, continue +// processing NAME until the list of blocks is empty. + +void +ranger_cache::iterative_cache_update (tree name) +{ + basic_block bb; + edge_iterator ei; + edge e; + int_range_max new_range; + int_range_max current_range; + int_range_max e_range; + + // Process each block by seeing if its calculated range on entry is + // the same as its cached value. If there is a difference, update + // the cache to reflect the new value, and check to see if any + // successors have cache entries which may need to be checked for + // updates. + + while (m_update_list.length () > 0) + { + bb = m_update_list.pop (); + gcc_checking_assert (m_on_entry.bb_range_p (name, bb)); + m_on_entry.get_bb_range (current_range, name, bb); + + // Calculate the "new" range on entry by unioning the pred edges. + new_range.set_undefined (); + FOR_EACH_EDGE (e, ei, bb->preds) + { + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, " edge %d->%d :", e->src->index, bb->index); + // Get whatever range we can for this edge. + if (!outgoing_edge_range_p (e_range, e, name)) + { + ssa_range_in_bb (e_range, name, e->src); + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, "No outgoing edge range, picked up "); + e_range.dump(dump_file); + fprintf (dump_file, "\n"); + } + } + else + { + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, "outgoing range :"); + e_range.dump(dump_file); + fprintf (dump_file, "\n"); + } + } + new_range.union_ (e_range); + if (new_range.varying_p ()) + break; + } + + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, "FWD visiting block %d for ", bb->index); + print_generic_expr (dump_file, name, TDF_SLIM); + fprintf (dump_file, " starting range : "); + current_range.dump (dump_file); + fprintf (dump_file, "\n"); + } + + // If the range on entry has changed, update it. + if (new_range != current_range) + { + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, " Updating range to "); + new_range.dump (dump_file); + fprintf (dump_file, "\n Updating blocks :"); + } + m_on_entry.set_bb_range (name, bb, new_range); + // Mark each successor that has a range to re-check its range + FOR_EACH_EDGE (e, ei, bb->succs) + if (m_on_entry.bb_range_p (name, e->dest)) + { + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, " bb%d",e->dest->index); + add_to_update (e->dest); + } + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "\n"); + } + } + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, "DONE visiting blocks for "); + print_generic_expr (dump_file, name, TDF_SLIM); + fprintf (dump_file, "\n"); + } +} + +// Make sure that the range-on-entry cache for NAME is set for block BB. +// Work back through the CFG to DEF_BB ensuring the range is calculated +// on the block/edges leading back to that point. + +void +ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb) +{ + edge_iterator ei; + edge e; + int_range_max block_result; + int_range_max undefined; + unsigned poor_list_start = m_poor_value_list.length (); + + // At this point we shouldn't be looking at the def, entry or exit block. + gcc_checking_assert (bb != def_bb && bb != ENTRY_BLOCK_PTR_FOR_FN (cfun) && + bb != EXIT_BLOCK_PTR_FOR_FN (cfun)); + + // If the block cache is set, then we've already visited this block. + if (m_on_entry.bb_range_p (name, bb)) + return; + + // Visit each block back to the DEF. Initialize each one to UNDEFINED. + // m_visited at the end will contain all the blocks that we needed to set + // the range_on_entry cache for. + m_workback.truncate (0); + m_workback.quick_push (bb); + undefined.set_undefined (); + m_on_entry.set_bb_range (name, bb, undefined); + gcc_checking_assert (m_update_list.length () == 0); + + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, "\n"); + print_generic_expr (dump_file, name, TDF_SLIM); + fprintf (dump_file, " : "); + } + + while (m_workback.length () > 0) + { + basic_block node = m_workback.pop (); + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, "BACK visiting block %d for ", node->index); + print_generic_expr (dump_file, name, TDF_SLIM); + fprintf (dump_file, "\n"); + } + + FOR_EACH_EDGE (e, ei, node->preds) + { + basic_block pred = e->src; + int_range_max r; + + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, " %d->%d ",e->src->index, e->dest->index); + + // If the pred block is the def block add this BB to update list. + if (pred == def_bb) + { + add_to_update (node); + continue; + } + + // If the pred is entry but NOT def, then it is used before + // defined, it'll get set to [] and no need to update it. + if (pred == ENTRY_BLOCK_PTR_FOR_FN (cfun)) + { + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "entry: bail."); + continue; + } + + // Regardless of whether we have visited pred or not, if the + // pred has a non-null reference, revisit this block. + if (m_non_null.non_null_deref_p (name, pred)) + { + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "nonnull: update "); + add_to_update (node); + } + + // If the pred block already has a range, or if it can contribute + // something new. Ie, the edge generates a range of some sort. + if (m_on_entry.get_bb_range (r, name, pred)) + { + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "has cache, "); + if (!r.undefined_p () || has_edge_range_p (e, name)) + { + add_to_update (node); + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "update. "); + } + continue; + } + + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "pushing undefined pred block. "); + // If the pred hasn't been visited (has no range), add it to + // the list. + gcc_checking_assert (!m_on_entry.bb_range_p (name, pred)); + m_on_entry.set_bb_range (name, pred, undefined); + m_workback.quick_push (pred); + } + } + + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "\n"); + + // Now fill in the marked blocks with values. + iterative_cache_update (name); + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, " iterative update done.\n"); + + // Now that the cache has been updated, check to see if there were any + // SSA_NAMES used in filling the cache which were "poor values". + // We can evaluate them, and inject any new values into the iteration + // list, and see if it improves any on-entry values. + if (poor_list_start != m_poor_value_list.length ()) + { + gcc_checking_assert (poor_list_start < m_poor_value_list.length ()); + while (poor_list_start < m_poor_value_list.length ()) + { + // Find a range for this unresolved value. + // Note, this may spawn new cache filling cycles, but by the time it + // is finished, the work vectors will all be back to the same state + // as before the call. The update record vector will always be + // returned to the current state upon return. + struct update_record rec = m_poor_value_list.pop (); + basic_block calc_bb = rec.bb; + int_range_max tmp; + + // The update work list should be empty at this point. + gcc_checking_assert (m_update_list.length () == 0); + + if (DEBUG_RANGE_CACHE) + { + fprintf (dump_file, "(%d:%d)Calculating ", + m_poor_value_list.length () + 1, poor_list_start); + print_generic_expr (dump_file, name, TDF_SLIM); + fprintf (dump_file, " used poor value for "); + print_generic_expr (dump_file, rec.calc, TDF_SLIM); + fprintf (dump_file, " in bb%d, trying to improve:\n", + calc_bb->index); + } + + // It must have at least one edge, pick edge 0. we just want to + // calculate a range at the exit from the block so the caches feeding + // this block will be filled up. + gcc_checking_assert (EDGE_SUCC (calc_bb, 0)); + query.range_on_edge (tmp, EDGE_SUCC (calc_bb, 0), rec.calc); + + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, " Checking successors of bb%d :", + calc_bb->index); + + // Try recalculating any successor blocks with the new value. + // Note that even if this value is refined from the initial value, + // it may not affect the calculation, but the iterative update + // will resolve that efficently. + FOR_EACH_EDGE (e, ei, calc_bb->succs) + { + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "bb%d: ", e->dest->index); + // Only update active cache entries. + if (m_on_entry.bb_range_p (name, e->dest)) + { + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "update "); + add_to_update (e->dest); + } + } + if (DEBUG_RANGE_CACHE) + fprintf (dump_file, "\n"); + // Now see if there is a new value. + iterative_cache_update (name); + } + } + +} diff --cc gcc/gimple-range-cache.h index 87656dd2bf4,00000000000..29ab01e2a98 mode 100644,000000..100644 --- a/gcc/gimple-range-cache.h +++ b/gcc/gimple-range-cache.h @@@ -1,120 -1,0 +1,120 @@@ +/* Header file for gimple ranger SSA cache. + Copyright (C) 2017-2020 Free Software Foundation, Inc. + Contributed by Andrew MacLeod . + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +#ifndef GCC_SSA_RANGE_CACHE_H +#define GCC_SSA_RANGE_CACHE_H + +#include "gimple-range-gori.h" + +// Class used to track non-null references of an SSA name. A vector +// of bitmaps indexed by SSA name is maintained. When indexed by +// basic block, an on-bit indicates there is a non-null dereference +// for that SSA in that block. + +class non_null_ref +{ +public: + non_null_ref (); + ~non_null_ref (); + bool non_null_deref_p (tree name, basic_block bb); +private: + vec m_nn; + void process_name (tree name); + bitmap_obstack m_bitmaps; +}; + +// This class manages a vector of pointers to ssa_block ranges. It +// provides the basis for the "range on entry" cache for all +// SSA names. + +class block_range_cache +{ +public: + block_range_cache (); + ~block_range_cache (); + + void set_bb_range (tree name, const basic_block bb, const irange &r); + void set_bb_varying (tree name, const basic_block bb); + bool get_bb_range (irange &r, tree name, const basic_block bb); + bool bb_range_p (tree name, const basic_block bb); + + void dump (FILE *f); + void dump (FILE *f, basic_block bb, bool print_varying = true); +private: + vec m_ssa_ranges; + ssa_block_ranges &get_block_ranges (tree name); - irange_pool *m_irange_pool; ++ irange_allocator *m_irange_allocator; +}; + +// This global cache is used with the range engine as markers for what +// has been visited during this incarnation. Once the ranger evaluates +// a name, it is typically not re-evaluated again. + +class ssa_global_cache +{ +public: + ssa_global_cache (); + ~ssa_global_cache (); + bool get_global_range (irange &r, tree name) const; + void set_global_range (tree name, const irange &r); + void clear_global_range (tree name); + void clear (); + void dump (FILE *f = stderr); +private: + vec m_tab; - class irange_pool *m_irange_pool; ++ class irange_allocator *m_irange_allocator; +}; + +// This class provides all the caches a global ranger may need, and makes +// them available for gori-computes to query so outgoing edges can be +// properly calculated. + +class ranger_cache : public gori_compute_cache +{ +public: + ranger_cache (class range_query &q); + ~ranger_cache (); + + virtual void ssa_range_in_bb (irange &r, tree name, basic_block bb); + bool block_range (irange &r, basic_block bb, tree name, bool calc = true); + + ssa_global_cache m_globals; + block_range_cache m_on_entry; + non_null_ref m_non_null; +private: + void add_to_update (basic_block bb); + void fill_block_cache (tree name, basic_block bb, basic_block def_bb); + void iterative_cache_update (tree name); + + vec m_workback; + vec m_update_list; + + // Iterative "poor value" calculations. + struct update_record + { + basic_block bb; // Block which value needs to be calculated in. + tree calc; // SSA_NAME which needs its value calculated. + }; + bool push_poor_value (basic_block bb, tree name); + vec m_poor_value_list; + class range_query &query; +}; + +#endif // GCC_SSA_RANGE_CACHE_H diff --cc gcc/gimple-range-edge.cc index e4653c8ce88,00000000000..a8e1e16cf43 mode 100644,000000..100644 --- a/gcc/gimple-range-edge.cc +++ b/gcc/gimple-range-edge.cc @@@ -1,197 -1,0 +1,197 @@@ +/* Gimple range edge functionaluity. + Copyright (C) 2020 Free Software Foundation, Inc. + Contributed by Andrew MacLeod + and Aldy Hernandez . + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "backend.h" +#include "tree.h" +#include "gimple.h" +#include "ssa.h" +#include "gimple-pretty-print.h" +#include "gimple-iterator.h" +#include "tree-cfg.h" +#include "gimple-range.h" + +// If there is a range control statment at the end of block BB, return it. +// Otherwise return NULL. + +gimple * +gimple_outgoing_range_stmt_p (basic_block bb) +{ + gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb); + if (!gsi_end_p (gsi)) + { + gimple *s = gsi_stmt (gsi); + if (is_a (s) && gimple_range_handler (s)) + return gsi_stmt (gsi); + gswitch *sw = dyn_cast (s); + if (sw && irange::supports_type_p (TREE_TYPE (gimple_switch_index (sw)))) + return gsi_stmt (gsi); + } + return NULL; +} + + +outgoing_range::outgoing_range () +{ + m_edge_table = NULL; +} + +outgoing_range::~outgoing_range () +{ + if (m_edge_table) + delete m_edge_table; +} + + +// Get a range for a switch edge E from statement S and return it in R. +// Use a cached value if it exists, or calculate it if not. + +bool +outgoing_range::get_edge_range (irange &r, gimple *s, edge e) +{ + gcc_checking_assert (is_a (s)); + gswitch *sw = as_a (s); + + // ADA currently has cases where the index is 64 bits and the case + // arguments are 32 bit, causing a trap when we create a case_range. + // Until this is resolved (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87798) + // punt on switches where the labels dont match the argument. + if (gimple_switch_num_labels (sw) > 1 && + TYPE_PRECISION (TREE_TYPE (CASE_LOW (gimple_switch_label (sw, 1)))) != + TYPE_PRECISION (TREE_TYPE (gimple_switch_index (sw)))) + return false; + + if (!m_edge_table) + m_edge_table = new hash_map (n_edges_for_fn (cfun)); + + irange **val = m_edge_table->get (e); + if (!val) + { + calc_switch_ranges (sw); + val = m_edge_table->get (e); + gcc_checking_assert (val); + } + r = **val; + return true; +} + + +// Calculate all switch edges from SW and cache them in the hash table. + +void +outgoing_range::calc_switch_ranges (gswitch *sw) +{ + bool existed; + unsigned x, lim; + lim = gimple_switch_num_labels (sw); + tree type = TREE_TYPE (gimple_switch_index (sw)); + + edge default_edge = gimple_switch_default_edge (cfun, sw); + irange *&default_slot = m_edge_table->get_or_insert (default_edge, &existed); + + // This should be the first call into this switch. For the default + // range case, start with varying and intersect each other case from + // it. + + gcc_checking_assert (!existed); + + // Allocate an int_range_max for default case. - default_slot = range_pool.allocate (255); ++ default_slot = range_allocator.allocate (255); + default_slot->set_varying (type); + + for (x = 1; x < lim; x++) + { + edge e = gimple_switch_edge (cfun, sw, x); + + // If this edge is the same as the default edge, do nothing else. + if (e == default_edge) + continue; + + tree low = CASE_LOW (gimple_switch_label (sw, x)); + tree high = CASE_HIGH (gimple_switch_label (sw, x)); + if (!high) + high = low; + + // Remove the case range from the default case. + int_range_max def_range (low, high); + range_cast (def_range, type); + def_range.invert (); + default_slot->intersect (def_range); + + // Create/union this case with anything on else on the edge. + int_range_max case_range (low, high); + range_cast (case_range, type); + irange *&slot = m_edge_table->get_or_insert (e, &existed); + if (existed) + { + case_range.union_ (*slot); + if (slot->fits_p (case_range)) + { + *slot = case_range; + continue; + } + } + // If there was an existing range and it doesn't fit, we lose the memory. + // It'll get reclaimed when the obstack is freed. This seems less + // intrusive than allocating max ranges for each case. - slot = range_pool.allocate (case_range); ++ slot = range_allocator.allocate (case_range); + } +} + + +// Calculate the range forced on on edge E by control flow, return it +// in R. Return the statment which defines the range, otherwise +// return NULL + +gimple * +outgoing_range::edge_range_p (irange &r, edge e) +{ + // Determine if there is an outgoing edge. + gimple *s = gimple_outgoing_range_stmt_p (e->src); + if (!s) + return NULL; + + if (is_a (s)) + { + if (e->flags & EDGE_TRUE_VALUE) + r = int_range<2> (boolean_true_node, boolean_true_node); + else if (e->flags & EDGE_FALSE_VALUE) + r = int_range<2> (boolean_false_node, boolean_false_node); + else + gcc_unreachable (); + return s; + } + + gcc_checking_assert (is_a (s)); + gswitch *sw = as_a (s); + tree type = TREE_TYPE (gimple_switch_index (sw)); + + if (!irange::supports_type_p (type)) + return NULL; + + if (get_edge_range (r, sw, e)) + return s; + + return NULL; +} diff --cc gcc/gimple-range-edge.h index e31008f9920,00000000000..5f3831a9db1 mode 100644,000000..100644 --- a/gcc/gimple-range-edge.h +++ b/gcc/gimple-range-edge.h @@@ -1,55 -1,0 +1,55 @@@ +/* Gimple range edge header file. + Copyright (C) 2020 Free Software Foundation, Inc. + Contributed by Andrew MacLeod + and Aldy Hernandez . + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +#ifndef GIMPLE_RANGE_EDGE_H +#define GIMPLE_RANGE_EDGE_H + +// This class is used to query ranges on constant edges in GIMPLE. +// +// For a COND_EXPR, the TRUE edge will return [1,1] and the false edge a [0,0]. +// +// For SWITCH_EXPR, it is awkward to calculate ranges. When a request +// is made, the entire switch is evalauted and the results cached. +// Any future requests to that switch will use the cached value, providing +// dramatic decrease in computation time. +// +// The API is simple, just ask for the range on the edge. +// The return value is NULL for no range, or the branch statement which the +// edge gets the range from, along with the range. + +class outgoing_range +{ +public: + outgoing_range (); + ~outgoing_range (); + gimple *edge_range_p (irange &r, edge e); +private: + void calc_switch_ranges (gswitch *sw); + bool get_edge_range (irange &r, gimple *s, edge e); + + hash_map *m_edge_table; - irange_pool range_pool; ++ irange_allocator range_allocator; +}; + +// If there is a range control statment at the end of block BB, return it. +gimple *gimple_outgoing_range_stmt_p (basic_block bb); + +#endif // GIMPLE_RANGE_EDGE_H