[PATCH] D23067: TargetInstrInfo: add two new target hooks to analyse branch offsets
Sjoerd Meijer via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 16 13:12:52 PDT 2016
SjoerdMeijer updated this revision to Diff 68247.
SjoerdMeijer added a comment.
Got rid of the recently added getRange functions.
This patch just introduces these 2 new target hooks: optimizeShortBranch and isBranchOffsetInRange.
https://reviews.llvm.org/D23067
Files:
include/llvm/Target/TargetInstrInfo.h
lib/Target/ARM/ARMBaseInstrInfo.cpp
lib/Target/ARM/ARMBaseInstrInfo.h
Index: lib/Target/ARM/ARMBaseInstrInfo.h
===================================================================
--- lib/Target/ARM/ARMBaseInstrInfo.h
+++ lib/Target/ARM/ARMBaseInstrInfo.h
@@ -120,6 +120,8 @@
const ScheduleDAG *DAG) const override;
// Branch analysis.
+ bool isBranchOffsetInRange(unsigned Opcode, int64_t Offset) const override;
+ int optimizeShortBranch(MachineInstr &MI, int64_t Offset) const override;
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
MachineBasicBlock *&FBB,
SmallVectorImpl<MachineOperand> &Cond,
Index: lib/Target/ARM/ARMBaseInstrInfo.cpp
===================================================================
--- lib/Target/ARM/ARMBaseInstrInfo.cpp
+++ lib/Target/ARM/ARMBaseInstrInfo.cpp
@@ -290,6 +290,31 @@
}
// Branch analysis.
+bool ARMBaseInstrInfo::isBranchOffsetInRange(unsigned Opcode,
+ int64_t Offset) const {
+ switch (Opcode) {
+ case ARM::tBcc:
+ if (Offset < -256 || Offset > 254)
+ return false;
+ case ARM::tB:
+ if (Offset < -2048 || Offset > 2046)
+ return false;
+ }
+ return true;
+}
+
+// Map branch instructions to Thumb1 equivalent branches.
+int ARMBaseInstrInfo::optimizeShortBranch(MachineInstr &MI,
+ int64_t Offset) const {
+ switch (MI.getOpcode()) {
+ case ARM::t2B:
+ return ARM::tB;
+ case ARM::t2Bcc:
+ return ARM::tBcc;
+ }
+ return -1;
+}
+
bool ARMBaseInstrInfo::analyzeBranch(MachineBasicBlock &MBB,
MachineBasicBlock *&TBB,
MachineBasicBlock *&FBB,
Index: include/llvm/Target/TargetInstrInfo.h
===================================================================
--- include/llvm/Target/TargetInstrInfo.h
+++ include/llvm/Target/TargetInstrInfo.h
@@ -477,6 +477,18 @@
return true;
}
+ /// Return true if the offset is in range of the branch instruction and
+ /// false otherwise.
+ virtual bool isBranchOffsetInRange(unsigned Opcode, int64_t Offset) const {
+ return true;
+ }
+
+ /// Return the opcode if there exist a branch instruction with a smaller
+ /// encoding, or -1 otherwise.
+ virtual int optimizeShortBranch(MachineInstr &MI, int64_t Offset) const {
+ return -1;
+ }
+
/// Represents a predicate at the MachineFunction level. The control flow a
/// MachineBranchPredicate represents is:
///
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23067.68247.patch
Type: text/x-patch
Size: 2531 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160816/bd857e51/attachment.bin>
More information about the llvm-commits
mailing list