]> gcc.gnu.org Git - gcc.git/commitdiff
re PR tree-optimization/60003 (wrong code with __builtin_setjmp/__builtin_longjmp...
authorJakub Jelinek <jakub@redhat.com>
Sat, 1 Feb 2014 08:40:31 +0000 (09:40 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 1 Feb 2014 08:40:31 +0000 (09:40 +0100)
PR tree-optimization/60003
* gimple-low.c (lower_builtin_setjmp): Set cfun->has_nonlocal_label.
* profile.c (branch_prob): Use gimple_call_builtin_p
to check for BUILT_IN_SETJMP_RECEIVER.
* tree-inline.c (copy_bb): Call notice_special_calls.

* gcc.c-torture/execute/pr60003.c: New test.

From-SVN: r207382

gcc/ChangeLog
gcc/gimple-low.c
gcc/profile.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr60003.c [new file with mode: 0644]
gcc/tree-inline.c

index 32eb882f40ecd5c78f9be32d9f1f28ef9cb2ed8d..6b6add62651bafca7377cb7a6c18bc4424890b87 100644 (file)
@@ -1,3 +1,11 @@
+2014-02-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/60003
+       * gimple-low.c (lower_builtin_setjmp): Set cfun->has_nonlocal_label.
+       * profile.c (branch_prob): Use gimple_call_builtin_p
+       to check for BUILT_IN_SETJMP_RECEIVER.
+       * tree-inline.c (copy_bb): Call notice_special_calls.
+
 2014-01-31  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR bootstrap/59985
index c60e8177d389b263171232d450dde19419d5231d..5fbcf3f34ac3cf51c998cbee95e5f706ea0f81de 100644 (file)
@@ -709,6 +709,12 @@ lower_builtin_setjmp (gimple_stmt_iterator *gsi)
   tree dest, t, arg;
   gimple g;
 
+  /* __builtin_setjmp_{setup,receiver} aren't ECF_RETURNS_TWICE and for RTL
+     these builtins are modelled as non-local label jumps to the label
+     that is passed to these two builtins, so pretend we have a non-local
+     label during GIMPLE passes too.  See PR60003.  */ 
+  cfun->has_nonlocal_label = true;
+
   /* NEXT_LABEL is the label __builtin_longjmp will jump to.  Its address is
      passed to both __builtin_setjmp_setup and __builtin_setjmp_receiver.  */
   FORCED_LABEL (next_label) = 1;
index 752d89fc3d87f3ffaf0fab1f06ebbd77e30ba916..83cbc07967b44cb152128a7b669726173e29df32 100644 (file)
@@ -1104,7 +1104,6 @@ branch_prob (void)
            {
              gimple_stmt_iterator gsi;
              gimple first;
-             tree fndecl;
 
              gsi = gsi_start_nondebug_after_labels_bb (bb);
              gcc_checking_assert (!gsi_end_p (gsi));
@@ -1114,10 +1113,7 @@ branch_prob (void)
                 special and don't expect anything to be inserted before
                 them.  */
              if (is_gimple_call (first)
-                 && (((fndecl = gimple_call_fndecl (first)) != NULL
-                      && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
-                      && (DECL_FUNCTION_CODE (fndecl)
-                          == BUILT_IN_SETJMP_RECEIVER))
+                 && (gimple_call_builtin_p (first, BUILT_IN_SETJMP_RECEIVER)
                      || (gimple_call_flags (first) & ECF_RETURNS_TWICE)
                      || (gimple_call_internal_p (first)
                          && (gimple_call_internal_fn (first)
index b1a657aea92e9cc74c202d037da72b49269bf1dd..302425935df9e0372ecf228b39df4454b0cd1b92 100644 (file)
@@ -1,3 +1,8 @@
+2014-02-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/60003
+       * gcc.c-torture/execute/pr60003.c: New test.
+
 2014-01-31  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR bootstrap/59985
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr60003.c b/gcc/testsuite/gcc.c-torture/execute/pr60003.c
new file mode 100644 (file)
index 0000000..94d9cf8
--- /dev/null
@@ -0,0 +1,48 @@
+/* PR tree-optimization/60003 */
+
+extern void abort (void);
+
+unsigned long long jmp_buf[5];
+
+__attribute__((noinline, noclone)) void
+baz (void)
+{
+  __builtin_longjmp (&jmp_buf, 1);
+}
+
+void
+bar (void)
+{
+  baz ();
+}
+
+__attribute__((noinline, noclone)) int
+foo (int x)
+{
+  int a = 0;
+
+  if (__builtin_setjmp (&jmp_buf) == 0)
+    {
+      while (1)
+       {
+         a = 1;
+         bar ();  /* OK if baz () instead */
+       }
+    }
+  else
+    {
+      if (a == 0)
+       return 0;
+      else
+       return x;
+    }
+}
+
+int
+main ()
+{
+  if (foo (1) == 0)
+    abort ();
+
+  return 0;
+}
index 79a39bca136c71bccea6122fca358c9165e15a89..439ef4c2933a793e76fe387379a081515441e458 100644 (file)
@@ -1745,7 +1745,6 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
          if (is_gimple_call (stmt))
            {
              struct cgraph_edge *edge;
-             int flags;
 
              switch (id->transform_call_graph_edges)
                {
@@ -1868,11 +1867,7 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
                    }
                }
 
-             flags = gimple_call_flags (stmt);
-             if (flags & ECF_MAY_BE_ALLOCA)
-               cfun->calls_alloca = true;
-             if (flags & ECF_RETURNS_TWICE)
-               cfun->calls_setjmp = true;
+             notice_special_calls (stmt);
            }
 
          maybe_duplicate_eh_stmt_fn (cfun, stmt, id->src_cfun, orig_stmt,
This page took 0.082471 seconds and 5 git commands to generate.