{
value_range op_res, res;
tree op = ipa_get_jf_pass_through_operand (jfunc);
- value_range op_vr (op, op);
+ value_range op_vr;
range_op_handler handler (operation, vr_type);
+ ipa_range_set_and_normalize (op_vr, op);
+
if (!handler
|| !op_res.supports_type_p (vr_type)
|| !handler.fold_range (op_res, vr_type, srcvr, op_vr))
else if (!ipa_edge_within_scc (cs))
{
tree op = ipa_get_jf_pass_through_operand (jfunc);
- value_range op_vr (op, op);
+ value_range op_vr;
value_range op_res,res;
range_op_handler handler (operation, operand_type);
+ ipa_range_set_and_normalize (op_vr, op);
+
if (!handler
|| !op_res.supports_type_p (operand_type)
|| !handler.fold_range (op_res, operand_type,
}
else if (!op->val[1])
{
- value_range op0 (op->val[0], op->val[0]);
+ value_range op0;
range_op_handler handler (op->code, op->type);
+ ipa_range_set_and_normalize (op0, op->val[0]);
+
if (!handler
|| !res.supports_type_p (op->type)
|| !handler.fold_range (res, op->type,
{
value_range res;
value_range val_vr;
- if (TREE_CODE (c->val) == INTEGER_CST)
- val_vr.set (c->val, c->val);
- else
- val_vr.set_varying (TREE_TYPE (c->val));
range_op_handler handler (c->code, boolean_type_node);
+ ipa_range_set_and_normalize (val_vr, c->val);
+
if (!handler
|| !res.supports_type_p (boolean_type_node)
|| !handler.fold_range (res, boolean_type_node, vr, val_vr))
/* In ipa-cp.cc */
void ipa_cp_cc_finalize (void);
+/* Set R to the range of [VAL, VAL] while normalizing addresses to
+ non-zero. */
+
+inline void
+ipa_range_set_and_normalize (irange &r, tree val)
+{
+ if (TREE_CODE (val) == INTEGER_CST)
+ r.set (val, val);
+ else if (TREE_CODE (val) == ADDR_EXPR)
+ r.set_nonzero (TREE_TYPE (val));
+ else
+ r.set_varying (TREE_TYPE (val));
+}
+
#endif /* IPA_PROP_H */
--- /dev/null
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern int k[];
+int m;
+int* j();
+void f(int *howto) {
+ short __trans_tmp_1;
+ long offset = howto - k;
+ __trans_tmp_1 = offset;
+ for (;;) {
+ if (howto == 0)
+ return;
+ if (__trans_tmp_1) {
+ howto = j();
+ m = *howto;
+ }
+ f(howto);
+ }
+}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-O2" }
+
+int g_variant_type_info_basic_table[1];
+int g_variant_type_info_check__g_boolean_var_, g_variant_type_info_get_index;
+int *g_variant_type_info_get_info;
+int g_assertion_message_expr();
+void g_variant_type_info_check(int *info) {
+ int index = info - g_variant_type_info_basic_table;
+ if (index)
+ g_variant_type_info_check__g_boolean_var_ = 1;
+ g_assertion_message_expr();
+}
+void g_variant_type_info_get() {
+ g_variant_type_info_get_info =
+ g_variant_type_info_basic_table + g_variant_type_info_get_index;
+ g_variant_type_info_check(g_variant_type_info_get_info);
+}
return;
}
+ gcc_checking_assert (TREE_CODE (min) == INTEGER_CST);
+ gcc_checking_assert (TREE_CODE (max) == INTEGER_CST);
+
if (TREE_OVERFLOW_P (min))
min = drop_tree_overflow (min);
if (TREE_OVERFLOW_P (max))