* tree-gimple.c (is_gimple_id): Export.
* tree-gimple.h (is_gimple_id): Declare.
* tree-ssa-ccp.c (ccp_decl_initial_min_invariant): New.
(get_default_value): Use it.
(maybe_fold_stmt_indirect): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@107244
138bc75d-0d04-0410-961f-
82ee72b054a4
+2005-11-19 Richard Henderson <rth@redhat.com>
+
+ PR tree-opt/24665
+ * tree-gimple.c (is_gimple_id): Export.
+ * tree-gimple.h (is_gimple_id): Declare.
+ * tree-ssa-ccp.c (ccp_decl_initial_min_invariant): New.
+ (get_default_value): Use it.
+ (maybe_fold_stmt_indirect): Likewise.
+
2005-11-19 James A. Morrison <phython@gcc.gnu.org>
* tree-vrp.c (compare_ranges): Return false for EQ_EXPR if VR0 is less
--- /dev/null
+// { dg-do compile }
+// { dg-options "-O2" }
+
+typedef unsigned long T;
+typedef volatile T* const hwreg_t;
+struct RegisterLayout
+{
+ T intmask;
+};
+struct Controller_t
+{
+ Controller_t();
+ inline void
+ disableInterrupt()
+ {
+ *mpMaskRegister = 0;
+ };
+ static hwreg_t mpMaskRegister;
+};
+
+extern char SimulatedRegisters[];
+
+hwreg_t Controller_t::mpMaskRegister
+ = &(reinterpret_cast<volatile RegisterLayout*>(SimulatedRegisters))->intmask;
+
+Controller_t::Controller_t()
+{
+ disableInterrupt();
+}
/* For the definitive definition of GIMPLE, see doc/tree-ssa.texi. */
-static inline bool is_gimple_id (tree);
-
/* Validation of GIMPLE expressions. */
/* Return true if T is a GIMPLE RHS for an assignment to a temporary. */
/* Return true if T is a GIMPLE identifier (something with an address). */
-static inline bool
+bool
is_gimple_id (tree t)
{
return (is_gimple_variable (t)
extern bool is_gimple_formal_tmp_reg (tree);
/* Returns true iff T is any sort of variable. */
extern bool is_gimple_variable (tree);
+/* Returns true iff T is any sort of symbol. */
+extern bool is_gimple_id (tree);
/* Returns true iff T is a variable or an INDIRECT_REF (of a variable). */
extern bool is_gimple_min_lval (tree);
/* Returns true iff T is something whose address can be taken. */
}
+/* The regular is_gimple_min_invariant does a shallow test of the object.
+ It assumes that full gimplification has happened, or will happen on the
+ object. For a value coming from DECL_INITIAL, this is not true, so we
+ have to be more strict outselves. */
+
+static bool
+ccp_decl_initial_min_invariant (tree t)
+{
+ if (!is_gimple_min_invariant (t))
+ return false;
+ if (TREE_CODE (t) == ADDR_EXPR)
+ {
+ /* Inline and unroll is_gimple_addressable. */
+ while (1)
+ {
+ t = TREE_OPERAND (t, 0);
+ if (is_gimple_id (t))
+ return true;
+ if (!handled_component_p (t))
+ return false;
+ }
+ }
+ return true;
+}
+
+
/* Compute a default value for variable VAR and store it in the
CONST_VAL array. The following rules are used to get default
values:
else if (TREE_STATIC (sym)
&& TREE_READONLY (sym)
&& DECL_INITIAL (sym)
- && is_gimple_min_invariant (DECL_INITIAL (sym)))
+ && ccp_decl_initial_min_invariant (DECL_INITIAL (sym)))
{
/* Globals and static variables declared 'const' take their
initial value. */
/* Fold away CONST_DECL to its value, if the type is scalar. */
if (TREE_CODE (base) == CONST_DECL
- && is_gimple_min_invariant (DECL_INITIAL (base)))
+ && ccp_decl_initial_min_invariant (DECL_INITIAL (base)))
return DECL_INITIAL (base);
/* Try folding *(&B+O) to B[X]. */