This fixes PR64121, where we ran into a SSA corruption failure
because we couldn't coalesce two SSA_NAME_OCCURS_IN_ABNORMAL_PHI
SSA_NAMEs.  So just skip such SSA names when looking for a base.

Bootstrapped/regtested on ppc64-linux, ok for trunk?

2014-12-01  Marek Polacek  <pola...@redhat.com>
            Jakub Jelinek  <ja...@redhat.com>

        PR sanitizer/64121
        * ubsan.c (instrument_object_size): Skip base if
        it occurs in abnormal phi.

        * c-c++-common/ubsan/pr64121.c: New test.

diff --git gcc/testsuite/c-c++-common/ubsan/pr64121.c 
gcc/testsuite/c-c++-common/ubsan/pr64121.c
index e69de29..82b216a 100644
--- gcc/testsuite/c-c++-common/ubsan/pr64121.c
+++ gcc/testsuite/c-c++-common/ubsan/pr64121.c
@@ -0,0 +1,16 @@
+/* PR sanitizer/64121 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=undefined -Wno-pointer-arith" } */
+
+extern int tab[16];
+
+void
+execute (int *ip, int x)
+{
+  int *xp = tab;
+base:
+  if (x)
+    return;
+  *xp++ = *ip;
+  goto *(&&base + *ip);
+}
diff --git gcc/ubsan.c gcc/ubsan.c
index ea5ccb4..e2a07a9 100644
--- gcc/ubsan.c
+++ gcc/ubsan.c
@@ -1564,7 +1564,14 @@ instrument_object_size (gimple_stmt_iterator *gsi, bool 
is_lhs)
              && POINTER_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (def_stmt))))
          || (is_gimple_assign (def_stmt)
              && gimple_assign_rhs_code (def_stmt) == POINTER_PLUS_EXPR))
-       base = gimple_assign_rhs1 (def_stmt);
+       {
+         tree rhs1 = gimple_assign_rhs1 (def_stmt);
+         if (TREE_CODE (rhs1) == SSA_NAME
+           && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1))
+           break;
+         else
+           base = rhs1;
+       }
       else
        break;
     }

        Marek

Reply via email to