@@ -527,6 +527,10 @@ func_checker::compare_variable_decl (tree t1, tree t2)
return return_with_debug (ret);
}
+
+/* Function visits all gimple labels and creates corresponding
+ mapping between basic blocks and labels. */
+
void
func_checker::parse_labels (sem_bb *bb)
{
@@ -765,7 +769,8 @@ func_checker::compare_gimple_label (gimple g1, gimple g2)
if (FORCED_LABEL (t1) || FORCED_LABEL (t2))
return return_false_with_msg ("FORCED_LABEL");
- return compare_tree_ssa_label (t1, t2);
+ /* As the pass build BB to label mapping, no further check is needed. */
+ return true;
}
/* Verifies for given GIMPLEs S1 and S2 that
@@ -145,6 +145,8 @@ public:
/* Memory release routine. */
~func_checker();
+ /* Function visits all gimple labels and creates corresponding
+ mapping between basic blocks and labels. */
void parse_labels (sem_bb *bb);
/* Basic block equivalence comparison function that returns true if
new file mode 100644
@@ -0,0 +1,47 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+class test
+{
+public:
+ test (int val, int *p)
+ {
+ int_val = *p;
+ bool_val = (val != int_val);
+ }
+
+ ~test ()
+ {
+ if (!bool_val)
+ return;
+ }
+
+ int get_int_val () const
+ {
+ return int_val;
+ }
+
+private:
+ bool bool_val;
+ int int_val;
+};
+
+static int __attribute__ ((noinline))
+f1 (int i, int *p)
+{
+ test obj (i, p);
+ return obj.get_int_val ();
+}
+
+static int __attribute__ ((noinline))
+f2 (int i, int *p)
+{
+ test obj (i, p);
+ return obj.get_int_val ();
+}
+
+int
+f (int i, int *p)
+{
+ return f1 (i, p) + f2 (i, p);
+}