This is a greatly-expanded version of: http://gcc.gnu.org/ml/gcc-patches/2013-12/msg01262.html
As of r205034 (de6bd75e3c9bc1efe8a6387d48eedaa4dafe622d) and r205428 (a90353203da18288cdac1b0b78fe7b22c69fe63f) the various gimple statements form a C++ inheritance hierarchy, but we're not yet making much use of that in the code: everything refers to just "gimple" (or "const_gimple"), and type-checking is performed at run-time within the various gimple_foo_* accessors in gimple.h, and almost nowhere else. The following patch series introduces compile-time checking of much of the handling of gimple statements. Various new typedefs are introduced for pointers to statements where the specific code is known, matching the corresponding names from gimple.def. For example, it introduces a "gimple_bind" typedef, which is a (gimple_statement_bind *) which has the invariant that stmt->code == GIMPLE_BIND. The idea is that all of the gimple_foo_* accessors in gimple.h are converted from taking just a "gimple" to a "gimple_foo". I've managed this so far for 15 of the gimple statement subclasses; for example, all of the "gimple_bind_*" accessors now require a "gimple_bind" rather than a plain "gimple". Similarly, variabless throughout the middle-end have their types strengthened from plain "gimple" to a typedef expressing a pointer to some concrete statement subclass, and similarly for vectors. For example various variables have their types strengthened from "gimple" to "gimple_bind", and from plain vec<gimple> to vec<gimple_bind> (e.g. within gimplify.c for handling the bind stack). Numerous other such typedefs are introduced: essentially two for each of the gimple code values: a gimple_foo and a const_gimple_foo variant e.g. gimple_switch and const_gimple_switch (some of the rarer codes don't have such typedefs yet). Some of these typedefs are aliases for existing subclasses within the "gimple" class hierarchy, but others are new with this patch series. As with the existing subclasses, they don't add any extra fields, they merely express invariants on the gimple's code. In each case there are some checked downcasts from "gimple" down to the more concrete statement-type, so that the runtime-checking in the checked build happens there, at the boundary between types, rather than the current checking, which is every time an accessor is called and almost nowhere else. Once we're in a more concrete type than "gimple", the compiler can enforce the type-checking for us at compile-time. An additional benefit is that human readers of the code should (I hope) have an easier time following what's going on: assumptions about the underlying gimple_code of a stmt that previously were hidden are now obvious, expressed directly in the type system. For example, various variables in tree-into-ssa.c change from just vec<gimple> to being vec<gimple_phi>, capturing the "phi-ness" of the contents as a compile-time check (and then not needing to check them any more); indeed great swathes of phi-manipulation code are changed from acting on vanilla "gimple" to acting on "gimple_phi". Similarly, within tree-inline.h's struct copy_body_data, the field "debug_stmts" can be "concretized" from a vec<gimple> to a vec<gimple_debug>. Another notable such concretization is that the "call_stmt" field of a cgraph_edge becomes a gimple_call, rather than a plain gimple. In doing the checked downcasts I ran into the verbosity of the as_a <> API (in our "is-a.h"). I first tried simplifying them with custom functions e.g.: static inline gimple_bind as_a_gimple_bind (gimple gs) { return as_a <gimple_statement_bind> (gs); } but the approach I've gone with makes these checked casts be *methods* of the gimple_statement_base class, so that e.g. in a switch statement you can write: case GIMPLE_SWITCH: dump_gimple_switch (buffer, gs->as_a_gimple_switch (), spc, flags); break; where the ->as_a_gimple_switch is a no-op cast from "gimple" to the more concrete "gimple_switch" in a release build, with runtime checking for code == GIMPLE_SWITCH added in a checked build (it uses as_a <> internally). This is much less verbose than trying to do it with as_a <> directly, and I think doing it as a method reads better aloud (to my English-speaking mind, at-least): "gs as a gimple switch", as opposed to: "as a gimple switch... gs", which I find clunky. It makes the base class a little cluttered, but IMHO it hits a sweet-spot of readability and type-safety with relatively little verbosity (only 8 more characters than doing it with a raw C-style cast). Another advantage of having the checked cast as a *method* is that it implicitly documents the requirement that the input must be non-NULL. There are an analogous family of "dyn_cast_gimple_foo" methods in the base class, again as an abbreviation of the rather verbose is-a.h API. For phis, I made gsi_start_phis return a gimple_phi_iterator, rather than a gimple_stmt_iterator, where the phi iterator type is new, a subclass of gimple_stmt_iterator. It has identical layout, but adds a "phi ()" method, which is like gsi_stmt(), but does a checked cast to a gimple_phi. This allows lots of phi-manipulation code to be concretized into working on type "gimple_phi" (rather than just "gimple"), with minimal patching. Having these typedefs around may also be useful for debugging, so that you can now type e.g. (gdb) p *(gimple_cond)stmt to quickly get all fields of a stmt (without having to think "is this code a gimple_statement_with_ops?") *********** Correctness *********** Successfully bootstrapped®tested the cumulative effect of the patches on x86_64-unknown-linux-gnu with cloog and thus graphite, with all frontends (via --enable-languages=all,ada,go), on top of r209027: the regrtest shows identical results to that of a control build, in both cases with: gcc/testsuite/ada/acats/acats.sum : total: 2320 PASS: 2320 gcc/testsuite/g++/g++.sum : total: 90205 FAIL: 3 PASS: 86738 XFAIL: 445 UNSUPPORTED: 3019 gcc/testsuite/gcc/gcc.sum : total: 110165 FAIL: 31 PASS: 108028 XFAIL: 263 XPASS: 40 UNSUPPORTED: 1803 gcc/testsuite/gfortran/gfortran.sum : total: 45650 PASS: 45533 XFAIL: 52 UNSUPPORTED: 65 gcc/testsuite/gnat/gnat.sum : total: 1245 PASS: 1224 XFAIL: 18 UNSUPPORTED: 3 gcc/testsuite/go/go.sum : total: 7266 PASS: 7258 XFAIL: 1 UNTESTED: 6 UNSUPPORTED: 1 gcc/testsuite/objc/objc.sum : total: 2973 PASS: 2893 XFAIL: 6 UNSUPPORTED: 74 x86_64-unknown-linux-gnu/boehm-gc/testsuite/boehm-gc.sum : total: 13 PASS: 12 UNSUPPORTED: 1 x86_64-unknown-linux-gnu/libatomic/testsuite/libatomic.sum : total: 54 PASS: 54 x86_64-unknown-linux-gnu/libffi/testsuite/libffi.sum : total: 1856 PASS: 1801 UNSUPPORTED: 55 x86_64-unknown-linux-gnu/libgo/libgo.sum : total: 122 PASS: 122 x86_64-unknown-linux-gnu/libgomp/testsuite/libgomp.sum : total: 2412 PASS: 2412 x86_64-unknown-linux-gnu/libitm/testsuite/libitm.sum : total: 30 PASS: 26 XFAIL: 3 UNSUPPORTED: 1 x86_64-unknown-linux-gnu/libjava/testsuite/libjava.sum : total: 2586 PASS: 2582 XFAIL: 4 x86_64-unknown-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum : total: 10260 PASS: 9995 XFAIL: 41 UNSUPPORTED: 224 apart from a test removed/test added false positive in: go.test/test/dwarf/dwarf.dir/main.go due to the test summary containing embedded absolute paths, which vary between my control vs experiment builds. [FWIW, for the above I used a new DejaVu result-handling tool I've written, "jamais-vu": https://github.com/davidmalcolm/jamais-vu which others on this list may find helpful] *********** Performance *********** I benchmarked the compiler with and without this patch series (experiment and control, respectively), by repeatedly building the two complicated C++ files supplied by Michael Matz in: http://gcc.gnu.org/ml/gcc-patches/2013-09/msg00062.html with stripped cc1plus, using taskset(1) to pin the cc1plus invocations to cpu 0 for consistency on this NUMA box. There were no significant differences in timings or memory usage between the runs; full details (including links to timeline graphs) follow: Compilation of kdecore.cc at -O3 with -g for x86_64-unknown-linux-gnu: usr control: [47.99, 47.91, 48.0, 47.99, 48.09, 48.36, 48.2, 48.11, 48.22, 47.88, 48.14, 48.25, 48.17, 48.17, 48.16, 48.24, 48.03, 47.88, 47.98, 47.98, 48.08, 48.02, 48.0, 47.99, 48.05, 48.21, 48.0, 48.16, 48.08, 48.05, 48.0, 48.13, 47.92, 47.9, 48.16, 48.03, 48.07, 48.12, 48.16, 48.14] experiment: [48.48, 48.05, 48.01, 48.19, 47.99, 47.95, 48.0, 48.0, 47.89, 47.81, 47.75, 47.94, 48.1, 48.02, 47.88, 47.83, 48.16, 48.04, 48.03, 47.98, 48.12, 48.05, 47.89, 48.03, 47.81, 47.88, 48.06, 47.85, 48.27, 47.99, 47.81, 48.07, 48.01, 48.06, 48.07, 47.95, 48.03, 47.9, 47.94, 47.99] Min: 47.880000 -> 47.750000: 1.00x faster Avg: 48.075500 -> 47.997000: 1.00x faster Not significant Stddev: 0.11145 -> 0.13531: 1.2141x larger Timeline: http://goo.gl/k3ct18 Compilation of kdecore.cc at -O3 with -g for x86_64-unknown-linux-gnu: sys control: [6.19, 6.29, 6.16, 6.25, 6.18, 6.06, 6.06, 6.19, 6.2, 6.27, 6.11, 6.09, 6.11, 6.0, 6.12, 6.25, 6.1, 6.32, 6.22, 6.23, 6.12, 6.13, 6.22, 6.13, 6.08, 6.02, 6.15, 6.11, 6.16, 6.16, 6.15, 6.05, 6.22, 6.24, 6.09, 6.12, 6.11, 6.14, 6.0, 5.99] experiment: [6.12, 6.1, 6.13, 6.17, 6.16, 6.18, 6.13, 6.15, 6.18, 6.3, 6.32, 6.17, 6.0, 6.17, 6.25, 6.25, 6.23, 6.15, 6.05, 6.13, 6.04, 6.12, 6.18, 6.14, 6.27, 6.18, 6.12, 6.23, 6.13, 6.09, 6.24, 6.12, 6.08, 6.07, 6.02, 6.33, 6.1, 6.19, 6.08, 6.14] Min: 5.990000 -> 6.000000: 1.00x slower Avg: 6.144750 -> 6.155250: 1.00x slower Not significant Stddev: 0.08105 -> 0.07782: 1.0415x smaller Timeline: http://goo.gl/wiiVbY Compilation of kdecore.cc at -O3 with -g for x86_64-unknown-linux-gnu: wall control: [54.9, 54.38, 54.34, 54.42, 54.45, 54.6, 54.44, 54.47, 54.6, 54.33, 54.43, 54.52, 54.46, 54.35, 54.46, 54.67, 54.31, 54.38, 54.37, 54.4, 54.37, 54.34, 54.41, 54.3, 54.31, 54.41, 54.34, 54.45, 54.43, 54.39, 54.33, 54.36, 54.31, 54.31, 54.43, 54.33, 54.36, 54.44, 54.34, 54.31] experiment: [54.96, 54.51, 54.53, 54.68, 54.56, 54.54, 54.54, 54.53, 54.44, 54.5, 54.47, 54.5, 54.5, 54.56, 54.46, 54.47, 54.78, 54.59, 54.48, 54.49, 54.5, 54.54, 54.46, 54.52, 54.47, 54.38, 54.47, 54.38, 54.74, 54.42, 54.4, 54.53, 54.41, 54.48, 54.44, 54.64, 54.49, 54.4, 54.31, 54.4] Min: 54.300000 -> 54.310000: 1.00x slower Avg: 54.413750 -> 54.511750: 1.00x slower Not significant Stddev: 0.11562 -> 0.11786: 1.0194x larger Timeline: http://goo.gl/1Xlhp6 Compilation of kdecore.cc at -O3 with -g for x86_64-unknown-linux-gnu: ggc control: [1298648.0, 1298649.0, 1298651.0, 1298656.0, 1298655.0, 1298651.0, 1298650.0, 1298652.0, 1298651.0, 1298650.0, 1298648.0, 1298644.0, 1298654.0, 1298655.0, 1298659.0, 1298659.0, 1298650.0, 1298652.0, 1298665.0, 1298655.0, 1298651.0, 1298655.0, 1298652.0, 1298656.0, 1298659.0, 1298653.0, 1298645.0, 1298649.0, 1298645.0, 1298643.0, 1298657.0, 1298653.0, 1298652.0, 1298659.0, 1298648.0, 1298651.0, 1298653.0, 1298651.0, 1298654.0, 1298651.0] experiment: [1298653.0, 1298658.0, 1298649.0, 1298658.0, 1298654.0, 1298654.0, 1298647.0, 1298652.0, 1298651.0, 1298652.0, 1298656.0, 1298649.0, 1298644.0, 1298655.0, 1298648.0, 1298650.0, 1298648.0, 1298652.0, 1298651.0, 1298649.0, 1298647.0, 1298661.0, 1298641.0, 1298652.0, 1298645.0, 1298650.0, 1298652.0, 1298652.0, 1298651.0, 1298650.0, 1298650.0, 1298655.0, 1298663.0, 1298655.0, 1298646.0, 1298648.0, 1298646.0, 1298652.0, 1298662.0, 1298651.0] Mem max: 1298665.000 -> 1298663.000: 1.0000x smaller Usage over time: http://goo.gl/aoTh9I Compilation of big-code.c at -O3 with -g for x86_64-unknown-linux-gnu: usr control: [37.03, 36.97, 36.99, 37.04, 36.97, 36.94, 37.02, 36.97, 37.05, 36.94, 36.92, 36.97, 37.03, 37.01, 37.04, 37.01, 36.99, 37.01, 37.07, 37.05, 36.98, 36.98, 37.05, 36.97, 36.95, 37.01, 37.0, 37.0, 37.23, 37.07, 36.78, 36.94, 37.04, 36.93, 36.98, 36.96, 36.91, 36.98, 37.05, 37.23] experiment: [36.96, 36.98, 36.93, 36.97, 36.94, 37.27, 37.0, 36.96, 37.03, 37.09, 36.85, 36.94, 36.99, 37.01, 37.0, 36.99, 36.98, 37.1, 37.04, 37.07, 36.93, 36.95, 36.96, 37.01, 36.97, 37.06, 36.95, 37.01, 36.98, 36.93, 37.14, 37.0, 36.92, 36.89, 36.98, 37.24, 36.97, 36.98, 36.96, 36.95] Min: 36.780000 -> 36.850000: 1.00x slower Avg: 37.001500 -> 36.997000: 1.00x faster Not significant Stddev: 0.07543 -> 0.08178: 1.0842x larger Timeline: http://goo.gl/591YUR Compilation of big-code.c at -O3 with -g for x86_64-unknown-linux-gnu: sys control: [1.29, 1.33, 1.32, 1.29, 1.32, 1.35, 1.3, 1.36, 1.25, 1.33, 1.33, 1.36, 1.28, 1.3, 1.28, 1.27, 1.29, 1.25, 1.27, 1.25, 1.29, 1.31, 1.33, 1.3, 1.3, 1.29, 1.28, 1.34, 1.3, 1.27, 1.34, 1.3, 1.28, 1.3, 1.3, 1.38, 1.37, 1.34, 1.24, 1.3] experiment: [1.29, 1.29, 1.3, 1.27, 1.31, 1.3, 1.3, 1.32, 1.25, 1.32, 1.34, 1.33, 1.28, 1.25, 1.3, 1.27, 1.27, 1.32, 1.27, 1.25, 1.34, 1.32, 1.33, 1.3, 1.29, 1.3, 1.28, 1.29, 1.3, 1.31, 1.23, 1.31, 1.3, 1.33, 1.34, 1.31, 1.32, 1.31, 1.3, 1.3] Min: 1.240000 -> 1.230000: 1.01x faster Avg: 1.304500 -> 1.298500: 1.00x faster Not significant Stddev: 0.03412 -> 0.02637: 1.2939x smaller Timeline: http://goo.gl/UA1Bvh Compilation of big-code.c at -O3 with -g for x86_64-unknown-linux-gnu: wall control: [38.43, 38.42, 38.43, 38.45, 38.41, 38.4, 38.43, 38.44, 38.41, 38.37, 38.37, 38.45, 38.42, 38.43, 38.43, 38.4, 38.39, 38.38, 38.45, 38.41, 38.38, 38.4, 38.49, 38.39, 38.36, 38.41, 38.39, 38.46, 38.65, 38.46, 38.23, 38.36, 38.44, 38.35, 38.39, 38.45, 38.39, 38.43, 38.41, 38.65] experiment: [38.36, 38.38, 38.34, 38.35, 38.36, 38.68, 38.41, 38.39, 38.38, 38.52, 38.3, 38.38, 38.38, 38.38, 38.42, 38.37, 38.36, 38.53, 38.42, 38.44, 38.37, 38.38, 38.4, 38.42, 38.38, 38.48, 38.34, 38.41, 38.4, 38.36, 38.49, 38.42, 38.33, 38.32, 38.43, 38.66, 38.41, 38.39, 38.37, 38.37] Min: 38.230000 -> 38.300000: 1.00x slower Avg: 38.420250 -> 38.407000: 1.00x faster Not significant Stddev: 0.06822 -> 0.07816: 1.1457x larger Timeline: http://goo.gl/clfhdm Compilation of big-code.c at -O3 with -g for x86_64-unknown-linux-gnu: ggc control: [662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 661798.0, 661798.0, 662310.0, 662310.0, 661798.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 661798.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 661798.0, 662310.0, 662310.0, 662310.0, 661798.0, 661798.0, 662310.0, 662310.0] experiment: [662310.0, 662310.0, 661798.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 661798.0, 662310.0, 662310.0, 662310.0, 661798.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0, 662310.0] Mem max: 662310.000 -> 662310.000: no change Usage over time: http://goo.gl/y77aRG *********************** Sizes of built binaries *********************** With --enable-checking=release, and stripping the resulting binaries: $ for binary in cc1 cc1obj cc1plus f951 jc1 ; do ls -al test/*/*/build/gcc/$binary ; done -rwxrwxr-x. 1 david david 15842584 Apr 17 14:27 test/control/x86_64-unknown-linux-gnu/build/gcc/cc1 -rwxrwxr-x. 1 david david 15838488 Apr 17 14:27 test/experiment/x86_64-unknown-linux-gnu/build/gcc/cc1 -rwxrwxr-x. 1 david david 16039192 Apr 17 14:27 test/control/x86_64-unknown-linux-gnu/build/gcc/cc1obj -rwxrwxr-x. 1 david david 16035096 Apr 17 14:27 test/experiment/x86_64-unknown-linux-gnu/build/gcc/cc1obj -rwxrwxr-x. 1 david david 17014104 Apr 17 14:27 test/control/x86_64-unknown-linux-gnu/build/gcc/cc1plus -rwxrwxr-x. 1 david david 17014104 Apr 17 14:27 test/experiment/x86_64-unknown-linux-gnu/build/gcc/cc1plus -rwxrwxr-x. 1 david david 16576600 Apr 17 14:27 test/control/x86_64-unknown-linux-gnu/build/gcc/f951 -rwxrwxr-x. 1 david david 16572504 Apr 17 14:27 test/experiment/x86_64-unknown-linux-gnu/build/gcc/f951 -rwxrwxr-x. 1 david david 15159256 Apr 17 14:27 test/control/x86_64-unknown-linux-gnu/build/gcc/jc1 -rwxrwxr-x. 1 david david 15159256 Apr 17 14:27 test/experiment/x86_64-unknown-linux-gnu/build/gcc/jc1 i.e. the sizes are either unchanged, or got very slightly smaller. **** Plan **** I'd like to commit this patch series to trunk for 4.10. I hope the overall plan sounds good. May I have reviews of the individual patches? (each patch builds on the ones before, but at any given patch in the series they should all compile cleanly together and not affect correctness/performance). I have a script that tracks how many of the gimple statement accessors take something more concrete than a plain gimple: https://github.com/davidmalcolm/gcc-refactoring-scripts/blob/master/gimple_typesafety.py which reports that the following statement subclasses are "done" in the sense that all of their accessors now accept a subclass pointer, rather than a plain gimple/const_gimple: gimple_asm_ (19 accessors) gimple_bind_ (10 accessors) gimple_catch_ (6 accessors) gimple_eh_dispatch_ (2 accessors) gimple_eh_else_ (6 accessors) gimple_eh_must_not_throw_ (2 accessors) gimple_label_ (2 accessors) gimple_omp_atomic_load_ (6 accessors) gimple_omp_atomic_store_ (3 accessors) gimple_omp_continue_ (6 accessors) gimple_omp_critical_ (3 accessors) gimple_resx_ (2 accessors) gimple_return_ (3 accessors) gimple_switch_ (9 accessors) gimple_transaction_ (8 accessors) and the following DONE/TODO breakdown by prefix: Accessors "concretized" by prefix --------------------------------- % Prefix DONE TODO 100 gimple_transaction_ 8 0 100 gimple_switch_ 9 0 100 gimple_return_ 3 0 100 gimple_resx_ 2 0 100 gimple_omp_critical_ 3 0 100 gimple_omp_continue_ 6 0 100 gimple_omp_atomic_store_ 3 0 100 gimple_omp_atomic_load_ 6 0 100 gimple_label_ 2 0 100 gimple_eh_must_not_throw_ 2 0 100 gimple_eh_else_ 6 0 100 gimple_eh_dispatch_ 2 0 100 gimple_catch_ 6 0 100 gimple_bind_ 10 0 100 gimple_asm_ 19 0 83 gimple_cond_ 15 3 72 gimple_omp_target_ 8 3 72 gimple_omp_parallel_ 8 3 58 gimple_call_ 25 18 57 gimple_phi_ 8 6 50 gimple_goto_ 1 1 40 gimple_try_ 4 6 33 gimple_omp_teams_ 1 2 33 gimple_omp_single_ 1 2 33 gimple_eh_filter_ 2 4 11 gimple_omp_for_ 3 24 5 gimple_assign_ 1 17 0 gimple_wce_ 0 5 0 gimple_predict_ 0 4 0 gimple_omp_task_ 0 18 0 gimple_omp_sections_ 0 6 0 gimple_omp_section_ 0 2 0 gimple_omp_return_ 0 5 0 gimple_omp_ 0 18 0 gimple_debug_ 0 12 Overall totals -------------- TODO: Builder calls still returning a plain gimple: 9 TODO: Accessors not yet converted to taking a gimple: 159 DONE: Builder calls converted to returning a gimple subclass: 37 DONE: Accessors converted to taking a gimple subclass: 167 NOTE: Accessors known not to need to be converted: 67 So this patch series as-is takes us a little over halfway there. The remaining accessors would involve more substantial re-indenting (typically to introduce blocks within case statements of a switch on statement code, so I can introduce a type-checked local). I didn't want to go down that path until the overall approach was OKed, since those kinds of changes are much more prone to generating conflicts as I rebase (and hence to bitrot). Thoughts? Dave David Malcolm (89): Const-correctness fixes for some gimple accessors Introduce gimple_switch and use it in various places Introduce gimple_bind and use it for accessors. Introduce gimple_cond and use it in various places Introduce gimple_assign and use it in various places Introduce gimple_label and use it in a few places Introduce gimple_debug and use it in a few places Introduce gimple_phi and use it in various places Introduce gimple_phi_iterator Update ssa_prop_visit_phi_fn callbacks to take a gimple_phi tree-parloops.c: use gimple_phi in various places tree-predcom.c: use gimple_phi in various places tree-ssa-phiprop.c: use gimple_phi tree-ssa-loop-niter.c: use gimple_phi in a few places tree-ssa-loop-manip.c: use gimple_phi in three places tree-ssa-loop-ivopts.c: use gimple_phi in a few places Update various expressions within tree-scalar-evolution.c to be gimple_phi Concretize get_loop_exit_condition et al to working on gimple_cond Const-correctness of gimple_call_builtin_p Introduce gimple_call Introduce gimple_return Introduce gimple_goto Introduce gimple_asm Introduce gimple_transaction Introduce gimple_catch Introduce gimple_eh_filter Introduce gimple_eh_must_not_throw Introduce gimple_eh_else Introduce gimple_resx Introduce gimple_eh_dispatch Use subclasses of gimple in various places Introduce gimple_try Use more concrete types for various gimple statements Introduce gimple_omp_atomic_load Introduce gimple_omp_atomic_store Introduce gimple_omp_continue Introduce gimple_omp_critical Introduce gimple_omp_for Introduce gimple_omp_parallel tree-cfg.c: Make verify_gimple_call require a gimple_call Introduce gimple_omp_task Introduce gimple_omp_single Introduce gimple_omp_target Introduce gimple_omp_teams Introduce gimple_omp_sections tree-parloops.c: Use gimple_phi in various places omp-low.c: Use more concrete types of gimple statement for various locals Make gimple_phi_arg_def_ptr and gimple_phi_arg_has_location require a gimple_phi Make add_phi_arg require a gimple_phi Make gimple_phi_arg_set_location require a gimple_phi Update GRAPHITE to use more concrete gimple statement classes Make gimple_phi_arg_edge require a gimple_phi More gimple_phi Make gimple_call_return_slot_opt_p require a gimple_call. Use gimple_call for callgraph edges Various gimple to gimple_call conversions in IPA Concretize parameter to gimple_call_copy_skip_args Make gimple_label_set_label require a gimple_label Make gimple_goto_set_dest require a gimple_goto Concretize gimple_catch_types Concretize gimple_call_use_set and gimple_call_clobber_set Concretize gimple_label_label Concretize gimple_eh_filter_set_types and gimple_eh_filter_set_failure Concretize gimple_try_set_catch_is_cleanup Concretize three gimple_try_set_ accessors Make gimple_phi_arg_location_from_edge require a gimple_phi Make gimple_phi_arg_location require a gimple_phi. Concretize three gimple_return_ accessors Make gimple_cond_set_{true|false}_label require gimple_cond. Concretize locals within expand_omp_for_init_counts Concretize gimple_cond_make_{false|true} Concretize gimple_switch_index and gimple_switch_index_ptr Concretize gimple_cond_{true|false}_label Concretize gimple_cond_set_code Concretize gimple_cond_set_{lhs|rhs} Concretize gimple_cond_{lhs|rhs}_ptr Concretize various expressions from gimple to gimple_cond Concretize gimple_call_set_nothrow Concretize gimple_call_nothrow_p Tweak to gimplify_modify_expr Concretize gimple_call_set_fn Concretize gimple_call_set_fntype Concretize gimple_call_set_tail and gimple_call_tail_p Concretize gimple_call_arg_flags Concretize gimple_assign_nontemporal_move_p Concretize gimple_call_copy_flags and ipa_modify_call_arguments Use gimple_call in some places within tree-ssa-dom.c Use gimple_phi in many more places. Convert various gimple to gimple_phi within ssa-iterators.h gcc/asan.c | 23 +- gcc/builtins.c | 11 +- gcc/builtins.h | 2 +- gcc/c-family/c-gimplify.c | 4 +- gcc/cfgexpand.c | 58 +- gcc/cfgloop.c | 6 +- gcc/cfgloopmanip.c | 4 +- gcc/cgraph.c | 22 +- gcc/cgraph.h | 17 +- gcc/cgraphbuild.c | 41 +- gcc/cgraphclones.c | 6 +- gcc/cgraphunit.c | 6 +- gcc/coretypes.h | 126 ++++ gcc/expr.h | 2 +- gcc/gdbhooks.py | 19 +- gcc/gimple-builder.c | 16 +- gcc/gimple-builder.h | 16 +- gcc/gimple-fold.c | 25 +- gcc/gimple-fold.h | 2 +- gcc/gimple-iterator.c | 12 +- gcc/gimple-iterator.h | 11 +- gcc/gimple-low.c | 39 +- gcc/gimple-pretty-print.c | 183 +++-- gcc/gimple-ssa-isolate-paths.c | 6 +- gcc/gimple-ssa-strength-reduction.c | 30 +- gcc/gimple-streamer-in.c | 34 +- gcc/gimple-streamer-out.c | 46 +- gcc/gimple-walk.c | 169 +++-- gcc/gimple.c | 347 +++++---- gcc/gimple.h | 1379 +++++++++++++++++++++-------------- gcc/gimplify-me.c | 29 +- gcc/gimplify.c | 125 ++-- gcc/gimplify.h | 6 +- gcc/graphite-scop-detection.c | 22 +- gcc/graphite-sese-to-poly.c | 141 ++-- gcc/internal-fn.c | 42 +- gcc/internal-fn.def | 2 +- gcc/internal-fn.h | 2 +- gcc/ipa-inline-analysis.c | 18 +- gcc/ipa-prop.c | 37 +- gcc/ipa-prop.h | 4 +- gcc/ipa-pure-const.c | 10 +- gcc/ipa-split.c | 95 +-- gcc/java/java-gimplify.c | 2 +- gcc/lto-streamer-in.c | 4 +- gcc/lto-streamer-out.c | 15 +- gcc/omp-low.c | 441 ++++++----- gcc/predict.c | 56 +- gcc/sese.c | 13 +- gcc/ssa-iterators.h | 20 +- gcc/stmt.c | 4 +- gcc/trans-mem.c | 132 ++-- gcc/tree-call-cdce.c | 29 +- gcc/tree-cfg.c | 407 ++++++----- gcc/tree-cfg.h | 4 +- gcc/tree-cfgcleanup.c | 44 +- gcc/tree-complex.c | 39 +- gcc/tree-data-ref.c | 3 +- gcc/tree-dfa.c | 10 +- gcc/tree-eh.c | 274 ++++--- gcc/tree-eh.h | 6 +- gcc/tree-emutls.c | 13 +- gcc/tree-if-conv.c | 15 +- gcc/tree-inline.c | 185 +++-- gcc/tree-inline.h | 2 +- gcc/tree-into-ssa.c | 59 +- gcc/tree-into-ssa.h | 2 +- gcc/tree-loop-distribution.c | 55 +- gcc/tree-nested.c | 45 +- gcc/tree-nrv.c | 11 +- gcc/tree-object-size.c | 20 +- gcc/tree-outof-ssa.c | 23 +- gcc/tree-parloops.c | 101 +-- gcc/tree-phinodes.c | 41 +- gcc/tree-phinodes.h | 8 +- gcc/tree-predcom.c | 30 +- gcc/tree-profile.c | 19 +- gcc/tree-scalar-evolution.c | 73 +- gcc/tree-scalar-evolution.h | 2 +- gcc/tree-sra.c | 125 ++-- gcc/tree-ssa-alias.c | 16 +- gcc/tree-ssa-alias.h | 2 +- gcc/tree-ssa-ccp.c | 32 +- gcc/tree-ssa-coalesce.c | 29 +- gcc/tree-ssa-copy.c | 11 +- gcc/tree-ssa-copyrename.c | 12 +- gcc/tree-ssa-dce.c | 37 +- gcc/tree-ssa-dom.c | 76 +- gcc/tree-ssa-forwprop.c | 21 +- gcc/tree-ssa-ifcombine.c | 27 +- gcc/tree-ssa-live.c | 16 +- gcc/tree-ssa-loop-im.c | 65 +- gcc/tree-ssa-loop-ivcanon.c | 41 +- gcc/tree-ssa-loop-ivopts.c | 44 +- gcc/tree-ssa-loop-manip.c | 64 +- gcc/tree-ssa-loop-niter.c | 25 +- gcc/tree-ssa-loop-prefetch.c | 4 +- gcc/tree-ssa-loop-unswitch.c | 19 +- gcc/tree-ssa-math-opts.c | 44 +- gcc/tree-ssa-operands.c | 8 +- gcc/tree-ssa-phiopt.c | 38 +- gcc/tree-ssa-phiprop.c | 12 +- gcc/tree-ssa-pre.c | 68 +- gcc/tree-ssa-propagate.c | 30 +- gcc/tree-ssa-propagate.h | 2 +- gcc/tree-ssa-reassoc.c | 39 +- gcc/tree-ssa-sccvn.c | 25 +- gcc/tree-ssa-sccvn.h | 2 +- gcc/tree-ssa-sink.c | 8 +- gcc/tree-ssa-strlen.c | 13 +- gcc/tree-ssa-structalias.c | 85 ++- gcc/tree-ssa-tail-merge.c | 33 +- gcc/tree-ssa-ter.c | 4 +- gcc/tree-ssa-threadedge.c | 19 +- gcc/tree-ssa-threadedge.h | 2 +- gcc/tree-ssa-threadupdate.c | 16 +- gcc/tree-ssa-uncprop.c | 7 +- gcc/tree-ssa-uninit.c | 57 +- gcc/tree-ssa.c | 56 +- gcc/tree-stdarg.c | 19 +- gcc/tree-switch-conversion.c | 57 +- gcc/tree-tailcall.c | 46 +- gcc/tree-vect-data-refs.c | 7 +- gcc/tree-vect-generic.c | 13 +- gcc/tree-vect-loop-manip.c | 74 +- gcc/tree-vect-loop.c | 61 +- gcc/tree-vect-patterns.c | 2 +- gcc/tree-vect-slp.c | 15 +- gcc/tree-vect-stmts.c | 22 +- gcc/tree-vectorizer.h | 2 +- gcc/tree-vrp.c | 100 +-- gcc/tree.c | 5 +- gcc/tree.h | 5 +- gcc/ubsan.c | 5 +- gcc/value-prof.c | 91 ++- gcc/value-prof.h | 3 +- gcc/vtable-verify.c | 2 +- 137 files changed, 4095 insertions(+), 3070 deletions(-) -- 1.8.5.3