| /* { 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); |
| } |