OSDN Git Service

Eliminate global pointers that are only stored a single value and null if
authorChris Lattner <sabre@nondot.org>
Sat, 9 Oct 2004 21:48:45 +0000 (21:48 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 9 Oct 2004 21:48:45 +0000 (21:48 +0000)
commit9b34a6101908c36df659fe0b188713c949a32304
treec125ed4872961a8e1bdafab0c4ca4d2ad98f2172
parent83d72bcd11d8d35a4031172e924453da9aec29c6
Eliminate global pointers that are only stored a single value and null if
we know that all uses of the global will trap if the pointer contained is
null.  In this case, we forward substitute the stored value to any uses.

This has the effect of devirtualizing trivial globals in trivial cases.  For
example, 164.gzip contains this:

gzip.h:extern   int (*read_buf) OF((char *buf, unsigned size));
bits.c: read_buf  = file_read;
deflate.c:    lookahead = read_buf((char*)window,
deflate.c:        n = read_buf((char*)window+strstart+lookahead, more);

Since read_buf has to point to file_read at every use, we just replace
the calls through read_buf with a direct call to file_read.

This occurs in several benchmarks, including 176.gcc and 164.gzip.  Direct
calls are good and stuff.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16871 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/IPO/GlobalOpt.cpp