aboutsummaryrefslogtreecommitdiff
path: root/gcc/genmodes.c
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@gcc.gnu.org>2016-07-26 15:19:58 +0000
committerPatrick Palka <ppalka@gcc.gnu.org>2016-07-26 15:19:58 +0000
commit524cf1e47a27e8a89390a46235b979e41781f618 (patch)
treea53f8a1a5848309a51cb3d1a26203dfdbb2631c6 /gcc/genmodes.c
parent100665d8d7460dab7a2c324a50ea8ac720ad9c43 (diff)
downloadgcc-524cf1e47a27e8a89390a46235b979e41781f618.zip
gcc-524cf1e47a27e8a89390a46235b979e41781f618.tar.gz
gcc-524cf1e47a27e8a89390a46235b979e41781f618.tar.bz2
Teach VRP to register assertions along default switch labels (PR18046)
gcc/ChangeLog: PR tree-optimization/18046 * genmodes.c (emit_mode_size_inline): Emit an assert that verifies that mode is a valid array index. (emit_mode_nuinits_inline): Likewise. (emit_mode_inner_inline): Likewise. (emit_mode_unit_size_inline): Likewise. (emit_mode_unit_precision_inline): Likewise. * tree-vrp.c: Include params.h. (find_switch_asserts): Register edge assertions for the default label which correspond to the anti-ranges of each case label. * params.def (PARAM_MAX_VRP_SWITCH_ASSERTIONS): New. * doc/invoke.texi: Document it. gcc/testsuite/ChangeLog: PR tree-optimization/18046 * gcc.dg/tree-ssa/ssa-dom-thread-6.c: Bump FSM count to 5. * gcc.dg/tree-ssa/vrp103.c: New test. * gcc.dg/tree-ssa/vrp104.c: New test. From-SVN: r238761
Diffstat (limited to 'gcc/genmodes.c')
-rw-r--r--gcc/genmodes.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/genmodes.c b/gcc/genmodes.c
index 097cc80..1170d4f 100644
--- a/gcc/genmodes.c
+++ b/gcc/genmodes.c
@@ -976,6 +976,7 @@ unsigned char\n\
mode_size_inline (machine_mode mode)\n\
{\n\
extern %sunsigned char mode_size[NUM_MACHINE_MODES];\n\
+ gcc_assert (mode >= 0 && mode < NUM_MACHINE_MODES);\n\
switch (mode)\n\
{\n", adj_bytesize ? "" : "const ");
@@ -1006,6 +1007,7 @@ unsigned char\n\
mode_nunits_inline (machine_mode mode)\n\
{\n\
extern const unsigned char mode_nunits[NUM_MACHINE_MODES];\n\
+ gcc_assert (mode >= 0 && mode < NUM_MACHINE_MODES);\n\
switch (mode)\n\
{");
@@ -1035,6 +1037,7 @@ unsigned char\n\
mode_inner_inline (machine_mode mode)\n\
{\n\
extern const unsigned char mode_inner[NUM_MACHINE_MODES];\n\
+ gcc_assert (mode >= 0 && mode < NUM_MACHINE_MODES);\n\
switch (mode)\n\
{");
@@ -1067,6 +1070,7 @@ mode_unit_size_inline (machine_mode mode)\n\
{\n\
extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES];\
\n\
+ gcc_assert (mode >= 0 && mode < NUM_MACHINE_MODES);\n\
switch (mode)\n\
{");
@@ -1103,6 +1107,7 @@ unsigned short\n\
mode_unit_precision_inline (machine_mode mode)\n\
{\n\
extern const unsigned short mode_unit_precision[NUM_MACHINE_MODES];\n\
+ gcc_assert (mode >= 0 && mode < NUM_MACHINE_MODES);\n\
switch (mode)\n\
{");