This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi Chris, Chris Lattner wrote:
This has my attention right now as I started writing some code to try and do exactly this a couple of weeks ago. As much of the microcontroller world revolves around code written with either proprietary processor-specific compilers, often using strange languages or subsets of languages then working from raw binaries is probably about the only real option.On Sat, 24 Aug 2002, Dave Hudson wrote: One of our future research problems is to see how well the LLVM "level raising" pass can process machine code, which has very little inherent type information available at all: there you don't even get function prototypes (but you can get the number of arguments). If you want me to explain a bit more about how and what the level raising does, just let me know.
It's this that is the biggest nuissance to me in fact. One obvious place where such ideas can be made to win is with code that can be compiled for say a single-threaded or multithreaded system. Being able to always compile for the multithreaded case knowing that the compiler would optimize away things like unecessary lock fields would be very useful.Sorta. Here you can eliminate global variables, but can you change their type, data layout, or other properties? Can you delete fields of global structures that are never used?
I've thought about doing this but haven't so far - lazy aren't I :-) I could make some of the gains I'm interested in by simply improving ld and indeed even quite small wins can have a disproportionate effect at times by helping our linker relaxation when it's stripping unecessary instructions from calls and jumps, but I'd rather look at places where much bigger wins can be achieved.* constantmerge - Merge global variable constants (basically .rodata) with identical contents together.This I could do with :-):) This actually is more or less possible with a smart binary linker though, isn't it?
The major problem I've encountered with this as it stands is that the RTL coming out of the global register allocation pass for the IP2022 is truly awful - it has to be extremely pessimistic so that reload doesn't fail (sad consequence of only having one useful pointer register other than the stack pointer - I said this wasn't an obvious target for gcc :-)). With that said however I still see quite a few bad things happening with the IP4k port of gcc and that doesn't have any significant restrictions in terms of pointer usage. I will have to go and read some more papers I guess.What kind of example are you interested in? LICM is a pretty well studied problem, and is actually a subset of a technique referred to as Partial Redundancy Elimination. GCC actually has optimizers that can do this, it's just that it doesn't have the alias analysis infrastructure to disambiguate loads/stores very well. RTL based optimizers also have problems inherent with working on a machine specific representation, but that if pretty much common to the backend (and is why transformations are being moved to the tree-ssa representation).
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |