[llvm-commits] [PATCH] Machine code verifier pass

Jim Grosbach grosbach at apple.com
Tue May 12 08:00:35 PDT 2009


On May 11, 2009, at 6:07 PM, Evan Cheng wrote:

>
> On May 11, 2009, at 1:45 PM, Jakob Stoklund Olesen wrote:
>
>>
>> On 11/05/2009, at 20.43, Evan Cheng wrote:
>>> +    const MachineBasicBlock *MBB;
>>> +    BBInfo *MBBInfo;
>>> +    const MachineInstr *MI;
>>> +    const MachineOperand *MO;
>>>
>>> I find it strange that these are class ivars. Can you change them to
>>> local variables and parameters?
>>
>> They provide context information to the report() messages, but you  
>> are
>> right, it is a bit weird. Functions declaring local variables of the
>> same name doesn't help either. I'll change it.
>
> Thanks.
>
>>
>>> +void
>>> +MachineVerifier::calcMaxRegsPassed()
>>> +{
>>> +  // First push live-out regs to successors' vregsPassed. Remember
>>> the MBBs that
>>> +  // have any vregsPassed.
>>> +  DenseSet<const MachineBasicBlock*> todo;
>>> +  for (MachineFunction::const_iterator MFI = MF->begin(), MFE = MF-
>>>> end();
>>> +       MFI != MFE; ++MFI) {
>>> +    const MachineBasicBlock &MBB(*MFI);
>>> +    BBInfo &MInfo = MBBInfoMap[&MBB];
>>> +    for (MachineBasicBlock::const_succ_iterator SuI =
>>> MBB.succ_begin(),
>>> +           SuE = MBB.succ_end(); SuI != SuE; ++SuI) {
>>> +      BBInfo &SInfo = MBBInfoMap[*SuI];
>>> +      if (SInfo.addPassed(MInfo.regsLiveOut))
>>> +        todo.insert(*SuI);
>>> +    }
>>> +  }
>>> +
>>> +  // Iteratively push vregsPassed to successors until convergence.
>>> +  while (!todo.empty()) {
>>>
>>> I don't think the order of iteration of DenseSet is deterministic.
>>
>> That is true, but it shouldn't matter. The algorithm will converge to
>> the same final state regardless of the iteration order.
>
> Ok.
>
>>
>>> +    // If any regs removed, we need to recheck successors
>>>
>>> Missing a period at the end of the sentence.
>>
>> Fixed.
>>
>>> Have you had a chance running this through some code?
>>
>> Yes, I am using it with all my Blackfin test cases. I have also tried
>> enabling it permanently when running the CodeGen test suite.
>>
>> CodeGen/ARM reveals that the verifier does not handle PHI  
>> instructions
>> properly. I will have to rework this! I also get lots of these  
>> errors:
>>
>> *** Bad machine code: Illegal physical register for instruction ***
>> - function:    f1
>> - basic block: ID#0
>> - instruction: %SP<def> = tADDspi %SP, 1
>> - operand 0:   %SP<def>
>> SP is not a tGPR register.
>>
>> This is not a real error - the thumb back-end rewrites these
>> instructions at a later stage, I think.
>
> Hrm. I would think tADDspi should be changed to target GPR instead  
> of tGPR since it's supposed to update SP. Jim, is there a reason why  
> that's not the case?

Looks like GPR is correct to me. There's no special reason to use tGPR  
there.

>
>
> How about x86? :-)
>>
>>
>>
>>
>> Evan, thanks for reviewing. I will implement your suggestions, and I
>> will also need do deal with PHI nodes and EH landing pads properly.
>> Then I'll submit a new patch.
>
> Great. Thanks.
>
> Evan
>
>>
>> /jakob
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list