+2015-09-30 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/67690
+ * tree-ssa-ifcombine.c (pass_tree_ifcombine::execute): Call
+ reset_flow_sensitive_info_in_bb.
+ * tree-ssa-tail-merge.c (replace_block_by): Likewise.
+ * tree-ssanames.c: Include "gimple-iterator.h".
+ (reset_flow_sensitive_info_in_bb): New function.
+ * tree-ssanames.h (reset_flow_sensitive_info_in_bb): Declare.
+
2015-09-30 Thomas Schwinge <thomas@codesourcery.com>
* config/i386/intelmic-mkoffload.c (target_ilp32): Remove
+2015-09-30 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/67690
+ * gcc.dg/torture/pr67690.c: New test.
+
2015-09-30 Christophe Lyon <christophe.lyon@linaro.org>
* g++.dg/cpp0x/stdint.C: Move dg-require-effective-target after
--- /dev/null
+/* { dg-do run } */
+
+const int c1 = 1;
+const int c2 = 2;
+
+int
+check (int i)
+{
+ int j;
+ if (i >= 0)
+ j = c2 - i;
+ else
+ j = c2 - i;
+ return c2 - c1 + 1 > j;
+}
+
+int invoke (int *pi) __attribute__ ((noinline,noclone));
+int
+invoke (int *pi)
+{
+ return check (*pi);
+}
+
+int
+main ()
+{
+ int i = c1;
+ int ret = invoke (&i);
+ if (!ret)
+ __builtin_abort ();
+ return 0;
+}
{
/* Clear range info from all stmts in BB which is now executed
conditional on a always true/false condition. */
- for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
- !gsi_end_p (gsi); gsi_next (&gsi))
- {
- gimple *stmt = gsi_stmt (gsi);
- ssa_op_iter i;
- tree op;
- FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
- reset_flow_sensitive_info (op);
- }
-
+ reset_flow_sensitive_info_in_bb (bb);
cfg_changed |= true;
}
}
e2->probability = GCOV_COMPUTE_SCALE (e2->count, out_sum);
}
+ /* Clear range info from all stmts in BB2 -- this transformation
+ could make them out of date. */
+ reset_flow_sensitive_info_in_bb (bb2);
+
/* Do updates that use bb1, before deleting bb1. */
release_last_vdef (bb1);
same_succ_flush_bb (bb1);
#include "backend.h"
#include "tree.h"
#include "gimple.h"
+#include "gimple-iterator.h"
#include "hard-reg-set.h"
#include "ssa.h"
#include "alias.h"
SSA_NAME_RANGE_INFO (name) = NULL;
}
+/* Clear all flow sensitive data from all statements and PHI definitions
+ in BB. */
+
+void
+reset_flow_sensitive_info_in_bb (basic_block bb)
+{
+ for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
+ gsi_next (&gsi))
+ {
+ gimple *stmt = gsi_stmt (gsi);
+ ssa_op_iter i;
+ tree op;
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
+ reset_flow_sensitive_info (op);
+ }
+
+ for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
+ gsi_next (&gsi))
+ {
+ tree phi_def = gimple_phi_result (gsi.phi ());
+ reset_flow_sensitive_info (phi_def);
+ }
+}
/* Release all the SSA_NAMEs created by STMT. */
extern void duplicate_ssa_name_range_info (tree, enum value_range_type,
struct range_info_def *);
extern void reset_flow_sensitive_info (tree);
+extern void reset_flow_sensitive_info_in_bb (basic_block);
extern void release_defs (gimple *);
extern void replace_ssa_name_symbol (tree, tree);