summaryrefslogtreecommitdiff
path: root/gcc/alias.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-13 13:59:00 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-13 13:59:00 +0000
commit26dfc4577ef0b6a585f0825b65535b489fba16a4 (patch)
treed0cc1485f0444d16267f642aaa62f86e34308a1e /gcc/alias.c
parente746d02c2855feb21ef3fb8a2cc574254674b2d2 (diff)
downloadgcc-26dfc4577ef0b6a585f0825b65535b489fba16a4.tar.gz
* alias.c (nonlocal_reference_p): Take a care for
CALL_INSNS's fusage field. * calls.c (ECF_PURE): New flag. (emit_call_1): Handle ECF_PURE calls. (initialize_argument_information): Unset ECF_PURE flag too. (precompute_arguments): Precompute for ECF_PURE too. (expand_call): Handle ECF_PURE calls too. (emit_library_call_value_1): Rename no_queue argument to fn_type, accept value of 2 as pure function. (emit_library_call_value, emit_library_call): Rename no_queue argument to fn_type. * optabs.c (prepare_cmp_insn): Pass fn_type 2 to memcmp call. * tree.h (DECL_IS_PURE): New macro. (struct tree_decl): Add pure_flag. * c-common.c (enum attrs): Add attribute "pure". (init_attributes): Initialize attribute "pure" (decl_attributes): Handle attribute "pure". * extend.texi (Attribute "pure"): Document. * calls.c (expand_call): Add (mem:BLK (scratch)) to "equal from" in pure function. (flags_from_decl_or_type): Support attribute "pure". git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33138 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/alias.c')
-rw-r--r--gcc/alias.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/alias.c b/gcc/alias.c
index db89ecc173e..fb493f8e7b0 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -1424,10 +1424,15 @@ nonlocal_reference_p (x)
if (GET_RTX_CLASS (code) == 'i')
{
- /* Constant functions are constant. */
+ /* Constant functions can be constant if they don't use
+ scratch memory used to mark function w/o side effects. */
if (code == CALL_INSN && CONST_CALL_P (x))
- return 0;
- x = PATTERN (x);
+ {
+ x = CALL_INSN_FUNCTION_USAGE (x);
+ if (!x) return 0;
+ }
+ else
+ x = PATTERN (x);
code = GET_CODE (x);
}
@@ -1520,7 +1525,7 @@ nonlocal_reference_p (x)
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
{
- if (fmt[i] == 'e')
+ if (fmt[i] == 'e' && XEXP (x, i))
{
if (nonlocal_reference_p (XEXP (x, i)))
return 1;