[LLVMdev] Possible bug in SimpleRegisterCoalescing

Steve Montgomery stephen.montgomery3 at btinternet.com
Mon Sep 19 08:24:13 PDT 2011


Thanks for your help. I've tried building from the trunk and it works, as you'd suggested.

On 13 Sep 2011, at 01:00, Jakob Stoklund Olesen wrote:

> 
> On Sep 12, 2011, at 10:56 AM, Steve Montgomery wrote:
> 
>> While working on a back-end for a target, I've come across something I believe to be a bug in SimpleRegisterCoalescing.cpp. I'm unsure how / whether to report it because I don't think it will necessarily crash or generate incorrect code for any of the supported targets.
>> 
>> I believe that there may be a problem in SimpleRegisterCoalescing::runOnMachineFunction where the allocatable registers for each register class are initialised for the function, i.e. the lines: 
>> 
>> for (TargetRegisterInfo::regclass_iterator I = tri_->regclass_begin(),
>>        E = tri_->regclass_end(); I != E; ++I)
>>   allocatableRCRegs_.insert(std::make_pair(*I,
>>                                            tri_->getAllocatableSet(fn, *I)));
>> 
>> If the allocatable registers are dependent on the function, such as might occur when a frame pointer isn't required, then it seems that every function will use the same allocatable set as the first function. [ a DenseMap insert operation has no effect if the key is already present ]
> 
> As Eric said, this code is completely different on trunk.
> 
> Specifically, the RegisterClassInfo class now caches this information.  It does cache information between functions, but it should invalidate the cache when the set of reserved registers change:
> 
>  // Different reserved registers?
>  BitVector RR = TRI->getReservedRegs(*MF);
>  if (RR != Reserved)
>    Update = true;
>  Reserved = RR;
> 
>  // Invalidate cached information from previous function.
>  if (Update)
>    ++Tag;
> 
> Please verify that it works, though.  As you can see, the set of reserved registers doesn't normally change.
> 
> /jakob
> 





More information about the llvm-dev mailing list