diff options
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 31 |
1 files changed, 10 insertions, 21 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index bc1e1ba..c74b988 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3571,11 +3571,10 @@ verify_gimple_assign_binary (gimple stmt) case PLUS_EXPR: case MINUS_EXPR: { - /* We use regular PLUS_EXPR and MINUS_EXPR for vectors. - ??? This just makes the checker happy and may not be what is - intended. */ - if (TREE_CODE (lhs_type) == VECTOR_TYPE - && POINTER_TYPE_P (TREE_TYPE (lhs_type))) + tree lhs_etype = lhs_type; + tree rhs1_etype = rhs1_type; + tree rhs2_etype = rhs2_type; + if (TREE_CODE (lhs_type) == VECTOR_TYPE) { if (TREE_CODE (rhs1_type) != VECTOR_TYPE || TREE_CODE (rhs2_type) != VECTOR_TYPE) @@ -3583,22 +3582,13 @@ verify_gimple_assign_binary (gimple stmt) error ("invalid non-vector operands to vector valued plus"); return true; } - lhs_type = TREE_TYPE (lhs_type); - rhs1_type = TREE_TYPE (rhs1_type); - rhs2_type = TREE_TYPE (rhs2_type); - /* PLUS_EXPR is commutative, so we might end up canonicalizing - the pointer to 2nd place. */ - if (POINTER_TYPE_P (rhs2_type)) - { - tree tem = rhs1_type; - rhs1_type = rhs2_type; - rhs2_type = tem; - } - goto do_pointer_plus_expr_check; + lhs_etype = TREE_TYPE (lhs_type); + rhs1_etype = TREE_TYPE (rhs1_type); + rhs2_etype = TREE_TYPE (rhs2_type); } - if (POINTER_TYPE_P (lhs_type) - || POINTER_TYPE_P (rhs1_type) - || POINTER_TYPE_P (rhs2_type)) + if (POINTER_TYPE_P (lhs_etype) + || POINTER_TYPE_P (rhs1_etype) + || POINTER_TYPE_P (rhs2_etype)) { error ("invalid (pointer) operands to plus/minus"); return true; @@ -3610,7 +3600,6 @@ verify_gimple_assign_binary (gimple stmt) case POINTER_PLUS_EXPR: { -do_pointer_plus_expr_check: if (!POINTER_TYPE_P (rhs1_type) || !useless_type_conversion_p (lhs_type, rhs1_type) || !ptrofftype_p (rhs2_type)) |