From c94cfd1c10db160ab2fc183ae48c00c380fd37bd Mon Sep 17 00:00:00 2001
From: rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 24 Jan 2006 23:48:17 +0000
Subject: [PATCH]         * alias.h (ALIAS_SET_MEMORY_BARRIER): New.         *
 alias.c (true_dependence): Respect it.         (canon_true_dependence,
 write_dependence_p): Likewise.         * builtins.c (get_builtin_sync_mem):
 Set it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110189 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog  |  7 +++++++
 gcc/alias.c    | 11 ++++++++++-
 gcc/alias.h    |  6 ++++++
 gcc/builtins.c |  3 ++-
 4 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6614b548b2a7..62a3fc7def66 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2006-01-24  Richard Henderson  <rth@redehat.com>
+
+	* alias.h (ALIAS_SET_MEMORY_BARRIER): New.
+	* alias.c (true_dependence): Respect it.
+	(canon_true_dependence, write_dependence_p): Likewise.
+	* builtins.c (get_builtin_sync_mem): Set it.
+
 2006-01-25  Zdenek Dvorak <dvorakz@suse.cz>
 
 	* loop-iv.c (iv_analysis_loop_init): Use df analysis in a more
diff --git a/gcc/alias.c b/gcc/alias.c
index 480601990927..68dff253abf8 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -1,5 +1,5 @@
 /* Alias analysis for GNU C
-   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
    Contributed by John Carr (jfc@mit.edu).
 
@@ -2209,6 +2209,9 @@ true_dependence (rtx mem, enum machine_mode mem_mode, rtx x,
     return 1;
   if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
     return 1;
+  if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
+      || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
+    return 1;
 
   if (DIFFERENT_ALIAS_SETS_P (x, mem))
     return 0;
@@ -2282,6 +2285,9 @@ canon_true_dependence (rtx mem, enum machine_mode mem_mode, rtx mem_addr,
     return 1;
   if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
     return 1;
+  if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
+      || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
+    return 1;
 
   if (DIFFERENT_ALIAS_SETS_P (x, mem))
     return 0;
@@ -2341,6 +2347,9 @@ write_dependence_p (rtx mem, rtx x, int writep)
     return 1;
   if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
     return 1;
+  if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
+      || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
+    return 1;
 
   if (DIFFERENT_ALIAS_SETS_P (x, mem))
     return 0;
diff --git a/gcc/alias.h b/gcc/alias.h
index c9154b3e58f8..83cc2d55094f 100644
--- a/gcc/alias.h
+++ b/gcc/alias.h
@@ -27,4 +27,10 @@ extern HOST_WIDE_INT get_frame_alias_set (void);
 extern void record_base_value (unsigned int, rtx, int);
 extern bool component_uses_parent_alias_set (tree);
 
+/* This alias set can be used to force a memory to conflict with all
+   other memories, creating a barrier across which no memory reference
+   can move.  Note that there are other legacy ways to create such
+   memory barriers, including an address of SCRATCH.  */
+#define ALIAS_SET_MEMORY_BARRIER	((HOST_WIDE_INT) -1)
+
 #endif /* GCC_ALIAS_H */
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 2d4322f97004..896fc48a4ded 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -1,6 +1,6 @@
 /* Expand builtin functions.
    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -5406,6 +5406,7 @@ get_builtin_sync_mem (tree loc, enum machine_mode mode)
   mem = validize_mem (gen_rtx_MEM (mode, addr));
 
   set_mem_align (mem, get_pointer_alignment (loc, BIGGEST_ALIGNMENT));
+  set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
   MEM_VOLATILE_P (mem) = 1;
 
   return mem;
-- 
GitLab