For GIMPLE_SINGLE_RHS, we don't currently test LHS for some invalid cases.
In this case all constants and ADDR_EXPR should be invalid on the LHS.
Also for vector (non-empty) constructors, the LHS needs to be an is_gimple_reg.
This adds the checks.
Also this fixes the following gimple testcase so it no longer ICEs, all functions are correctly rejected:
```
typedef vector int vi;
void __GIMPLE b1(int t) {
1 = t;
}
void __GIMPLE b2() {
1 = 2;
}
void __GIMPLE b3(int t, int t1) {
&t1 = &t;
}
void __GIMPLE b4(vi t, vi t1) {
_Literal(vi){0} = _Literal(vi){1};
}
void __GIMPLE b5(vi t, vi t1) {
_Literal(vi){t} = _Literal(vi){t1};
}
```
Bootstrapped and tested on x86_64-linux-gnu.
PR middle-end/120921
gcc/ChangeLog:
* tree-cfg.cc (verify_gimple_assign_single): Reject constant and address expression LHS.
For non-empty vector constructors, make sure the LHS is an is_gimple_reg.
Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
return true;
}
+ /* LHS can't be a constant or an address expression. */
+ if (CONSTANT_CLASS_P (lhs)|| TREE_CODE (lhs) == ADDR_EXPR)
+ {
+ error ("invalid LHS (%qs) for assignment: %qs",
+ get_tree_code_name (TREE_CODE (lhs)), code_name);
+ return true;
+ }
+
if (gimple_clobber_p (stmt)
&& !(DECL_P (lhs) || TREE_CODE (lhs) == MEM_REF))
{
if (CONSTRUCTOR_NELTS (rhs1) == 0)
return res;
+ if (!is_gimple_reg (lhs))
+ {
+ error ("non-register as LHS with vector constructor");
+ return true;
+ }
/* For vector CONSTRUCTORs we require that either it is empty
CONSTRUCTOR, or it is a CONSTRUCTOR of smaller vector elements
(then the element count must be correct to cover the whole