On Wed, Jun 9, 2021 at 3:33 AM apinski--- via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > From: Andrew Pinski <apin...@marvell.com> > > While debugging PR 100925, I found that the gimple verifiers > don't reject NEGATE on pointer or offset type. > This patch adds the check on some unary and binary gimple which > should not have operated on pointer/offset types. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
Are you sure we don't see sth like EXACT_DIV for OFFSET_TYPE? (I never remember the contexts where OFFSET_TYPE appears, but I suppose it's from virtual calls / vtable adjustments or so - but also not sure why we need to treat it different from integer types at all...) Thanks, Richard. > Thanks, > Andrew Pinski > > gcc/ChangeLog: > > * tree-cfg.c (verify_gimple_assign_unary): Reject point and offset > types on NEGATE_EXPR, ABS_EXPR, BIT_NOT_EXPR, PAREN_EXPR and > CNONJ_EXPR. > (verify_gimple_assign_binary): Reject point and offset types on > MULT_EXPR, MULT_HIGHPART_EXPR, TRUNC_DIV_EXPR, CEIL_DIV_EXPR, > FLOOR_DIV_EXPR, ROUND_DIV_EXPR, TRUNC_MOD_EXPR, CEIL_MOD_EXPR, > FLOOR_MOD_EXPR, ROUND_MOD_EXPR, RDIV_EXPR, and EXACT_DIV_EXPR. > --- > gcc/tree-cfg.c | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c > index 02256580c98..90fe4775405 100644 > --- a/gcc/tree-cfg.c > +++ b/gcc/tree-cfg.c > @@ -3752,6 +3752,15 @@ verify_gimple_assign_unary (gassign *stmt) > case BIT_NOT_EXPR: > case PAREN_EXPR: > case CONJ_EXPR: > + /* Disallow pointer and offset types for many of the unary gimple. */ > + if (POINTER_TYPE_P (lhs_type) > + || TREE_CODE (lhs_type) == OFFSET_TYPE) > + { > + error ("invalid types for %qs", code_name); > + debug_generic_expr (lhs_type); > + debug_generic_expr (rhs1_type); > + return true; > + } > break; > > case ABSU_EXPR: > @@ -4127,6 +4136,19 @@ verify_gimple_assign_binary (gassign *stmt) > case ROUND_MOD_EXPR: > case RDIV_EXPR: > case EXACT_DIV_EXPR: > + /* Disallow pointer and offset types for many of the binary gimple. */ > + if (POINTER_TYPE_P (lhs_type) > + || TREE_CODE (lhs_type) == OFFSET_TYPE) > + { > + error ("invalid types for %qs", code_name); > + debug_generic_expr (lhs_type); > + debug_generic_expr (rhs1_type); > + debug_generic_expr (rhs2_type); > + return true; > + } > + /* Continue with generic binary expression handling. */ > + break; > + > case MIN_EXPR: > case MAX_EXPR: > case BIT_IOR_EXPR: > -- > 2.27.0 >