mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 08:30:35 +08:00
Ensure arguments to range-op handler are supported.
PR tree-optimization/107985 gcc/ * gimple-range-op.cc (gimple_range_op_handler::gimple_range_op_handler): Check if type of the operands is supported. * gimple-range.cc (gimple_ranger::prefill_stmt_dependencies): Do not assert if here is no range-op handler. gcc/testsuite/ * g++.dg/pr107985.C: New.
This commit is contained in:
parent
bb2e5da7ef
commit
0ef9991d87
@ -148,6 +148,9 @@ gimple_range_op_handler::gimple_range_op_handler (gimple *s)
|
||||
case GIMPLE_COND:
|
||||
m_op1 = gimple_cond_lhs (m_stmt);
|
||||
m_op2 = gimple_cond_rhs (m_stmt);
|
||||
// Check that operands are supported types. One check is enough.
|
||||
if (!Value_Range::supports_type_p (TREE_TYPE (m_op1)))
|
||||
m_valid = false;
|
||||
return;
|
||||
case GIMPLE_ASSIGN:
|
||||
m_op1 = gimple_range_base_of_assignment (m_stmt);
|
||||
@ -164,6 +167,9 @@ gimple_range_op_handler::gimple_range_op_handler (gimple *s)
|
||||
}
|
||||
if (gimple_num_ops (m_stmt) >= 3)
|
||||
m_op2 = gimple_assign_rhs2 (m_stmt);
|
||||
// Check that operands are supported types. One check is enough.
|
||||
if ((m_op1 && !Value_Range::supports_type_p (TREE_TYPE (m_op1))))
|
||||
m_valid = false;
|
||||
return;
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
|
@ -422,18 +422,20 @@ gimple_ranger::prefill_stmt_dependencies (tree ssa)
|
||||
else
|
||||
{
|
||||
gimple_range_op_handler handler (stmt);
|
||||
gcc_checking_assert (handler);
|
||||
tree op = handler.operand2 ();
|
||||
if (op)
|
||||
if (handler)
|
||||
{
|
||||
Value_Range r (TREE_TYPE (op));
|
||||
prefill_name (r, op);
|
||||
}
|
||||
op = handler.operand1 ();
|
||||
if (op)
|
||||
{
|
||||
Value_Range r (TREE_TYPE (op));
|
||||
prefill_name (r, op);
|
||||
tree op = handler.operand2 ();
|
||||
if (op)
|
||||
{
|
||||
Value_Range r (TREE_TYPE (op));
|
||||
prefill_name (r, op);
|
||||
}
|
||||
op = handler.operand1 ();
|
||||
if (op)
|
||||
{
|
||||
Value_Range r (TREE_TYPE (op));
|
||||
prefill_name (r, op);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
18
gcc/testsuite/g++.dg/pr107985.C
Normal file
18
gcc/testsuite/g++.dg/pr107985.C
Normal file
@ -0,0 +1,18 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1 -ftree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre" } */
|
||||
|
||||
struct B {
|
||||
int f;
|
||||
};
|
||||
|
||||
struct D : public B {
|
||||
};
|
||||
|
||||
void foo() {
|
||||
D d;
|
||||
d.f = 7;
|
||||
|
||||
int B::* pfb = &B::f;
|
||||
int D::* pfd = pfb;
|
||||
int v = d.*pfd;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user