This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Don't optimize away calls to looping pure builtins (PR middle-end/44974)


Hi!

If some builtin has definition available to the compiler and
this noreturn definition just calls some other noreturn function,
Honza's recent changes mark if as DECL_PURE_P with
DECL_LOOPING_CONST_OR_PURE_P, which says to DCE that it shouldn't
optimize such calls away, but it can be CSEd etc.

expand_builtin wasn't expecting that any builtin might
be DECL_LOOPING_CONST_OR_PURE_P though and thus was
optimizing away any call to pure or const builtin, if the return
value is ignored.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2010-08-20  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/44974
	* builtins.c (expand_builtin): Don't optimize away
	calls to DECL_LOOPING_CONST_OR_PURE_P builtins.

	* gcc.dg/pr44974.c: New test.

--- gcc/builtins.c.jj	2010-08-13 10:15:19.000000000 +0200
+++ gcc/builtins.c	2010-08-20 16:51:09.000000000 +0200
@@ -5770,7 +5770,8 @@ expand_builtin (tree exp, rtx target, rt
      none of its arguments are volatile, we can avoid expanding the
      built-in call and just evaluate the arguments for side-effects.  */
   if (target == const0_rtx
-      && (DECL_PURE_P (fndecl) || TREE_READONLY (fndecl)))
+      && (DECL_PURE_P (fndecl) || TREE_READONLY (fndecl))
+      && !DECL_LOOPING_CONST_OR_PURE_P (fndecl))
     {
       bool volatilep = false;
       tree arg;
--- gcc/testsuite/gcc.dg/pr44974.c.jj	2010-08-20 17:11:04.000000000 +0200
+++ gcc/testsuite/gcc.dg/pr44974.c	2010-08-20 17:10:10.000000000 +0200
@@ -0,0 +1,23 @@
+/* PR middle-end/44974 */
+/* { dg-do compile } */
+/* { dg-options "-O -fno-optimize-sibling-calls" } */
+
+extern void foo (int status) __attribute__ ((__noreturn__));
+extern void bar (int status) __attribute__ ((__noreturn__));
+extern void _Exit (int status) __attribute__ ((__noreturn__));
+
+void
+foo (int status)
+{
+  _Exit (status);
+}
+
+void
+_Exit (int status)
+{
+  bar (status);
+}
+
+/* { dg-final { scan-assembler "call\[^\n\]*_Exit" { target i?86-*-* x86_64-*-* ia64-*-* sparc*-*-* } } } */
+/* { dg-final { scan-assembler "bl\[^\n\]*_Exit" { target powerpc*-*-* } } } */
+/* { dg-final { scan-assembler "brasl\[^\n\]*_Exit" { target { s390*-*-* && lp64 } } } } */

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]