From: Erik P. <epe...@iv...> - 2013-06-29 07:38:40
|
On Sat, 29 Jun 2013, Philipp Klaus Krause wrote: > I want to use information on live ranges in lospre. To do that, I > changed the old call to computeLiveRanges() to recomputeLiveRanges() and > inserted the following code in line 2206 of SDCCopt.c: > > computeControlFlow (ebbi); > loops = createLoopRegions (ebbi); > computeDataFlow (ebbi); > computeLiveRanges (ebbi->bbOrder, ebbi->count, TRUE); > > But then I get a fatal error on the call to killDeadCode() in in line > 2218. What's the problem here? computeLiveRanges() calls sequenceiCode() which assigns the sequence values to the individual iCodes as well as initializing the first and last sequence value for the eBBlock. After the call to lospre() is: ebbi = iCodeBreakDown (ic); This generates a completely new set of eBBlock structs with the first and last sequence value for the block defaulting to 0. Now the data structures are in a state that remiCodeFromeBBlock() cannot handle; if the iCodes have been assigned sequence values, then it is expected that the eBBlocks will have them too. I think the easiest fix would be to clear the iCode sequence values when grouping them into new blocks in iCode2eBBlock() by inserting: ic->seq = 0; // around SDCCBBlock.c line 315 loop->seq = 0; // around SDCCBBlock.c line 364 The alternative would be to have something update the first/last sequence values in the eBBlock from the first/last iCode sequence values, but this could run into problems if a new iCode had been inserted into the block without a proper sequence value assigned. This is why I think zeroing the iCode sequence values is preferable. > I do not get that error when commenting out the line > computeLiveRanges (ebbi->bbOrder, ebbi->count, TRUE); Yes, then both the iCodes and the eBBlocks still have the default sequence value of zero and remiCodeFromeBBlock() is happy with this case. Erik |