diff options
| author | Juergen Ributzka <juergen@apple.com> | 2014-09-02 22:33:53 +0000 |
|---|---|---|
| committer | Juergen Ributzka <juergen@apple.com> | 2014-09-02 22:33:53 +0000 |
| commit | 8a4b8bebdc4d3baed2bcc431951d3cf013a48087 (patch) | |
| tree | e7ff104e4ee5a8afba2d20bca5e501366bec60b1 /llvm/lib | |
| parent | 888320e9fa5eb33194c066f68d50f1e73c5fff5e (diff) | |
| download | bcm5719-llvm-8a4b8bebdc4d3baed2bcc431951d3cf013a48087.tar.gz bcm5719-llvm-8a4b8bebdc4d3baed2bcc431951d3cf013a48087.zip | |
[FastISel][AArch64] Use a new helper function to determine if a value type is supported. NFCI.
FastISel for AArch64 supports more value types than are actually legal. Use a
dedicated helper function to reflect this.
It is very similar to the isLoadStoreTypeLegal function, with the exception
that vector types are not supported yet.
llvm-svn: 216984
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64FastISel.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64FastISel.cpp b/llvm/lib/Target/AArch64/AArch64FastISel.cpp index 087f38e2265..280d11af470 100644 --- a/llvm/lib/Target/AArch64/AArch64FastISel.cpp +++ b/llvm/lib/Target/AArch64/AArch64FastISel.cpp @@ -134,6 +134,7 @@ private: // Utility helper routines. bool isTypeLegal(Type *Ty, MVT &VT); bool isLoadStoreTypeLegal(Type *Ty, MVT &VT); + bool isTypeSupported(Type *Ty, MVT &VT); bool isValueAvailable(const Value *V) const; bool ComputeAddress(const Value *Obj, Address &Addr, Type *Ty = nullptr); bool ComputeCallAddress(const Value *V, Address &Addr); @@ -680,6 +681,26 @@ bool AArch64FastISel::isLoadStoreTypeLegal(Type *Ty, MVT &VT) { return false; } +/// \brief Determine if the value type is supported by FastISel. +/// +/// FastISel for AArch64 can handle more value types than are legal. This adds +/// simple value type such as i1, i8, and i16. +/// Vectors on the other side are not supported yet. +bool AArch64FastISel::isTypeSupported(Type *Ty, MVT &VT) { + if (Ty->isVectorTy()) + return false; + + if (isTypeLegal(Ty, VT)) + return true; + + // If this is a type than can be sign or zero-extended to a basic operation + // go ahead and accept it now. + if (VT == MVT::i1 || VT == MVT::i8 || VT == MVT::i16) + return true; + + return false; +} + bool AArch64FastISel::isValueAvailable(const Value *V) const { if (!isa<Instruction>(V)) return true; @@ -1571,7 +1592,7 @@ bool AArch64FastISel::SelectBranch(const Instruction *I) { } else if (TruncInst *TI = dyn_cast<TruncInst>(BI->getCondition())) { MVT SrcVT; if (TI->hasOneUse() && TI->getParent() == I->getParent() && - (isLoadStoreTypeLegal(TI->getOperand(0)->getType(), SrcVT))) { + (isTypeSupported(TI->getOperand(0)->getType(), SrcVT))) { unsigned CondReg = getRegForValue(TI->getOperand(0)); if (!CondReg) return false; @@ -3295,7 +3316,7 @@ bool AArch64FastISel::SelectMul(const Instruction *I) { bool AArch64FastISel::SelectShift(const Instruction *I) { MVT RetVT; - if (!isLoadStoreTypeLegal(I->getType(), RetVT)) + if (!isTypeSupported(I->getType(), RetVT)) return false; if (const auto *C = dyn_cast<ConstantInt>(I->getOperand(1))) { @@ -3306,16 +3327,14 @@ bool AArch64FastISel::SelectShift(const Instruction *I) { const Value *Op0 = I->getOperand(0); if (const auto *ZExt = dyn_cast<ZExtInst>(Op0)) { MVT TmpVT; - if (isValueAvailable(ZExt) && - isLoadStoreTypeLegal(ZExt->getSrcTy(), TmpVT)) { + if (isValueAvailable(ZExt) && isTypeSupported(ZExt->getSrcTy(), TmpVT)) { SrcVT = TmpVT; IsZExt = true; Op0 = ZExt->getOperand(0); } } else if (const auto *SExt = dyn_cast<SExtInst>(Op0)) { MVT TmpVT; - if (isValueAvailable(SExt) && - isLoadStoreTypeLegal(SExt->getSrcTy(), TmpVT)) { + if (isValueAvailable(SExt) && isTypeSupported(SExt->getSrcTy(), TmpVT)) { SrcVT = TmpVT; IsZExt = false; Op0 = SExt->getOperand(0); |

