From 4858c6f781f80bddbccca207e6ca1b5aa0a91fdc Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 16 Mar 2007 08:43:56 +0000 Subject: [PATCH] Added isLegalAddressExpression(). Only allows X +/- C for now. llvm-svn: 35122 --- lib/Target/ARM/ARMISelLowering.cpp | 15 +++++++++++++++ lib/Target/ARM/ARMISelLowering.h | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index f23d8aeb37e..40ede7409ac 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -22,6 +22,7 @@ #include "ARMTargetMachine.h" #include "llvm/CallingConv.h" #include "llvm/Constants.h" +#include "llvm/Instruction.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" @@ -1269,6 +1270,20 @@ ARMTargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI, // ARM Optimization Hooks //===----------------------------------------------------------------------===// +/// isLegalAddressExpression - Return true if the binary expression made up of +/// specified opcode, operands, and type can be folded into target addressing +/// mode for load / store of the given type. +bool ARMTargetLowering::isLegalAddressExpression(unsigned Opc, Value *Op0, + Value *Op1, const Type *Ty) const { + if (ConstantInt *Op1C = dyn_cast(Op1)) { + if (Opc == Instruction::Add) + return isLegalAddressImmediate(Op1C->getSExtValue(), Ty); + if (Opc == Instruction::Sub) + return isLegalAddressImmediate(-Op1C->getSExtValue(), Ty); + } + return false; +} + /// isLegalAddressImmediate - Return true if the integer value can be used /// as the offset of the target addressing mode for load / store of the /// given type. diff --git a/lib/Target/ARM/ARMISelLowering.h b/lib/Target/ARM/ARMISelLowering.h index 7feb2c3ef7b..47bd4b2f1a4 100644 --- a/lib/Target/ARM/ARMISelLowering.h +++ b/lib/Target/ARM/ARMISelLowering.h @@ -80,6 +80,12 @@ namespace llvm { virtual MachineBasicBlock *InsertAtEndOfBasicBlock(MachineInstr *MI, MachineBasicBlock *MBB); + /// isLegalAddressExpression - Return true if the binary expression made up + /// of specified opcode, operands, and type can be folded into target + /// addressing mode for load / store of the given type. + virtual bool isLegalAddressExpression(unsigned Opc, Value *Op0, Value *Op1, + const Type *Ty) const; + /// isLegalAddressImmediate - Return true if the integer value can be used /// as the offset of the target addressing mode for load / store of the /// given type.