re PR tree-optimization/38789 (__builtin_constant_p appears to evaluate to true for non-constant arguments.)

PR tree-optimization/38789
	* tree-ssa-threadedge.c
	(record_temporary_equivalences_from_stmts_at_dest): Ignore calls to
	__builtin_constant_p.

	* gcc.c-torture/compile/pr38789.c: New test.

From-SVN: r143435
This commit is contained in:
Jakub Jelinek 2009-01-16 16:01:24 +01:00 committed by Jakub Jelinek
parent cd3f172908
commit 56c6a49994
4 changed files with 43 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2009-01-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/38789
* tree-ssa-threadedge.c
(record_temporary_equivalences_from_stmts_at_dest): Ignore calls to
__builtin_constant_p.
2009-01-16 Kenneth Zadeck <zadeck@naturalbridge.com>
* dce.c (delete_unmarked_insns): Reversed the order that insns are

View File

@ -1,3 +1,8 @@
2009-01-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/38789
* gcc.c-torture/compile/pr38789.c: New test.
2009-01-16 Janus Weil <janus@gcc.gnu.org>
PR fortran/38152

View File

@ -0,0 +1,18 @@
/* PR tree-optimization/38789 */
void
baz (int v)
{
unsigned a = (v == 1) ? 1 : 2;
if (__builtin_constant_p (a))
asm volatile ("# constant %0" :: "i" (a));
else
asm volatile ("# register %0" :: "r" (a));
a = 6;
if (__builtin_constant_p (a))
asm volatile ("# constant %0" :: "i" (a));
else
asm volatile ("# register %0" :: "r" (a));
}

View File

@ -1,5 +1,5 @@
/* SSA Jump Threading
Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
Contributed by Jeff Law <law@redhat.com>
This file is part of GCC.
@ -320,12 +320,22 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
The result of __builtin_object_size is defined to be the maximum of
remaining bytes. If we use only one edge on the phi, the result will
change to be the remaining bytes for the corresponding phi argument. */
change to be the remaining bytes for the corresponding phi argument.
Similarly for __builtin_constant_p:
r = PHI <1(2), 2(3)>
__builtin_constant_p (r)
Both PHI arguments are constant, but x ? 1 : 2 is still not
constant. */
if (is_gimple_call (stmt))
{
tree fndecl = gimple_call_fndecl (stmt);
if (fndecl && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_OBJECT_SIZE)
if (fndecl
&& (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_OBJECT_SIZE
|| DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P))
continue;
}