[llvm-commits] CVS: llvm/lib/Target/ARM/ARMInstrInfo.cpp ARMInstrInfo.h ARMTargetMachine.cpp ARMTargetMachine.h
Evan Cheng
evan.cheng at apple.com
Wed May 16 01:02:27 PDT 2007
On May 15, 2007, at 11:50 PM, Chris Lattner wrote:
>> Hooks for predication support.
>
> yay!
>
>> +bool ARMInstrInfo::isPredicatable(MachineInstr *MI) const {
>> + const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
>> + if (TID->Flags & M_PREDICATED)
>> + return true;
>> +
>> + unsigned Opc = MI->getOpcode();
>> + return Opc == ARM::B || Opc == ARM::tB;
>> +}
>> +
>> +void ARMInstrInfo::PredicateInstruction(MachineInstr *MI,
>> + std::vector<MachineOperand>
>> &Cond) const {
>> + unsigned Opc = MI->getOpcode();
>> + if (Opc == ARM::B || Opc == ARM::tB) {
>> + MI->setInstrDescriptor(get(Opc == ARM::B ? ARM::Bcc :
>> ARM::tBcc));
>> + MI->addImmOperand(Cond[0].getImmedValue());
>> + return;
>> + }
>> +
>> + MachineOperand *PMO = MI->findFirstPredOperand();
>> + PMO->setImm(Cond[0].getImmedValue());
>> +}
>
> I don't think there is any reason for this to be virtual and target-
> specific. In particular, can you please model B/tB the same way PPC
> handles branches (where an uncond branch is just a conditional branch
> where the condition is set to 'always')? That way, you don't need a
> special case, isPredicatable doesn't need to be virtual, and each
> target doesn't need to implement PredicateInstruction.
Hrm? PPC has two separate opcodes for conditional and unconditional
branches.
Are you talking about not having separate opcodes representing
conditional and unconditional branches? I suppose that's ok except
for some additional complexity added to AnalyzeBranch (and the fact
it's harder to read the debug output). I'd prefer to keep the two
separate (but ok with giving ARM::B a ''always' predicate).
But even then I am not sure if that eliminate the need to have a
virtual function isPredicatable. Conditional branches probably would
require special handling. Also, while it isn't possible now, it's
conceivable some instruction predicate field may not be 'always'
coming into the if-conversion pass. In that case, it would require a
target hook to examine the field anyway.
Evan
>
> -Chris
> _______________________________________________
> 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