diff options
author | Ian Lance Taylor <iant@google.com> | 2008-07-24 04:51:12 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2008-07-24 04:51:12 +0000 |
commit | 11522353fe7d3490ecf2877879bd2978b2277926 (patch) | |
tree | e15d5bf5c67194c4fee0af6c55638ec97a3044e8 /gcc | |
parent | e816b6b586db405da98b97e1940c595bb5ee1ffa (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/20080723-1.c | 49 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 4 |
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; |