aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2008-07-24 04:51:12 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2008-07-24 04:51:12 +0000
commit11522353fe7d3490ecf2877879bd2978b2277926 (patch)
treee15d5bf5c67194c4fee0af6c55638ec97a3044e8 /gcc
parente816b6b586db405da98b97e1940c595bb5ee1ffa (diff)
downloadgcc-11522353fe7d3490ecf2877879bd2978b2277926.zip
gcc-11522353fe7d3490ecf2877879bd2978b2277926.tar.gz
gcc-11522353fe7d3490ecf2877879bd2978b2277926.tar.bz2
tree-vrp.c (infer_value_range): Ignore asm statements when looking for memory accesses for...
./: * tree-vrp.c (infer_value_range): Ignore asm statements when looking for memory accesses for -fdelete-null-pointer-checks. testsuite/: * gcc.target/i386/20080723-1.c: New test. From-SVN: r138107
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/i386/20080723-1.c49
-rw-r--r--gcc/tree-vrp.c4
4 files changed, 61 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 82c7e61..b032c85 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2008-07-23 Ian Lance Taylor <iant@google.com>
+
+ * tree-vrp.c (infer_value_range): Ignore asm statements when
+ looking for memory accesses for -fdelete-null-pointer-checks.
+
2008-07-24 Ben Elliston <bje@au.ibm.com>
* config/spu/spu-c.c (__vector_keyword): New variable.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5be864f..f4d271c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2008-07-23 Ian Lance Taylor <iant@google.com>
+
+ * gcc.target/i386/20080723-1.c: New test.
+
2008-07-24 Ben Elliston <bje@au.ibm.com>
* gcc.target/spu/vector.c: New test.
diff --git a/gcc/testsuite/gcc.target/i386/20080723-1.c b/gcc/testsuite/gcc.target/i386/20080723-1.c
new file mode 100644
index 0000000..a2ed5bf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/20080723-1.c
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+extern void exit (int);
+
+static inline __attribute__((always_inline))
+void
+prefetch (void *x)
+{
+ asm volatile("prefetcht0 %0" : : "m" (*(unsigned long *)x));
+}
+
+struct hlist_head
+{
+ struct hlist_node *first;
+};
+
+struct hlist_node
+{
+ struct hlist_node *next;
+ unsigned long i_ino;
+};
+
+struct hlist_node * find_inode_fast(struct hlist_head *head, unsigned long ino)
+{
+ struct hlist_node *node;
+
+ for (node = head->first;
+ node && (prefetch (node->next), 1);
+ node = node->next)
+ {
+ if (node->i_ino == ino)
+ break;
+ }
+ return node ? node : 0;
+}
+
+struct hlist_node g2;
+struct hlist_node g1 = { &g2 };
+struct hlist_head h = { &g1 };
+
+int
+main()
+{
+ if (find_inode_fast (&h, 1) != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 404531f..62f3147 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3456,7 +3456,9 @@ infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
/* We can only assume that a pointer dereference will yield
non-NULL if -fdelete-null-pointer-checks is enabled. */
- if (flag_delete_null_pointer_checks && POINTER_TYPE_P (TREE_TYPE (op)))
+ if (flag_delete_null_pointer_checks
+ && POINTER_TYPE_P (TREE_TYPE (op))
+ && TREE_CODE (stmt) != ASM_EXPR)
{
unsigned num_uses, num_loads, num_stores;