[llvm-commits] [llvm] r168230 - in /llvm/trunk: lib/Target/Mips/MipsISelLowering.cpp lib/Target/Mips/MipsISelLowering.h test/CodeGen/Mips/addressing-mode.ll
Akira Hatanaka
ahatanaka at mips.com
Fri Nov 16 16:25:41 PST 2012
Author: ahatanak
Date: Fri Nov 16 18:25:41 2012
New Revision: 168230
URL: http://llvm.org/viewvc/llvm-project?rev=168230&view=rev
Log:
Initial implementation of MipsTargetLowering::isLegalAddressingMode.
Added:
llvm/trunk/test/CodeGen/Mips/addressing-mode.ll
Modified:
llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp
llvm/trunk/lib/Target/Mips/MipsISelLowering.h
Modified: llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp?rev=168230&r1=168229&r2=168230&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp Fri Nov 16 18:25:41 2012
@@ -3483,6 +3483,26 @@
}
bool
+MipsTargetLowering::isLegalAddressingMode(const AddrMode &AM, Type *Ty) const {
+ // No global is ever allowed as a base.
+ if (AM.BaseGV)
+ return false;
+
+ switch (AM.Scale) {
+ case 0: // "r+i" or just "i", depending on HasBaseReg.
+ break;
+ case 1:
+ if (!AM.HasBaseReg) // allow "r+i".
+ break;
+ return false; // disallow "r+r" or "r+r+i".
+ default:
+ return false;
+ }
+
+ return true;
+}
+
+bool
MipsTargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
// The Mips target isn't yet aware of offsets.
return false;
Modified: llvm/trunk/lib/Target/Mips/MipsISelLowering.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsISelLowering.h?rev=168230&r1=168229&r2=168230&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsISelLowering.h (original)
+++ llvm/trunk/lib/Target/Mips/MipsISelLowering.h Fri Nov 16 18:25:41 2012
@@ -357,6 +357,8 @@
std::vector<SDValue> &Ops,
SelectionDAG &DAG) const;
+ virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const;
+
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
virtual EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign,
Added: llvm/trunk/test/CodeGen/Mips/addressing-mode.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/addressing-mode.ll?rev=168230&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Mips/addressing-mode.ll (added)
+++ llvm/trunk/test/CodeGen/Mips/addressing-mode.ll Fri Nov 16 18:25:41 2012
@@ -0,0 +1,41 @@
+; RUN: llc -march=mipsel < %s | FileCheck %s
+
+ at g0 = common global i32 0, align 4
+ at g1 = common global i32 0, align 4
+
+; Check that LSR doesn't choose a solution with a formula "reg + 4*reg".
+;
+; CHECK: $BB0_2:
+; CHECK-NOT: sll ${{[0-9]+}}, ${{[0-9]+}}, 2
+
+define i32 @f0(i32 %n, i32 %m, [256 x i32]* nocapture %a, [256 x i32]* nocapture %b) nounwind readonly {
+entry:
+ br label %for.cond1.preheader
+
+for.cond1.preheader:
+ %s.022 = phi i32 [ 0, %entry ], [ %add7, %for.inc9 ]
+ %i.021 = phi i32 [ 0, %entry ], [ %add10, %for.inc9 ]
+ br label %for.body3
+
+for.body3:
+ %s.120 = phi i32 [ %s.022, %for.cond1.preheader ], [ %add7, %for.body3 ]
+ %j.019 = phi i32 [ 0, %for.cond1.preheader ], [ %add8, %for.body3 ]
+ %arrayidx4 = getelementptr inbounds [256 x i32]* %a, i32 %i.021, i32 %j.019
+ %0 = load i32* %arrayidx4, align 4
+ %arrayidx6 = getelementptr inbounds [256 x i32]* %b, i32 %i.021, i32 %j.019
+ %1 = load i32* %arrayidx6, align 4
+ %add = add i32 %0, %s.120
+ %add7 = add i32 %add, %1
+ %add8 = add nsw i32 %j.019, %m
+ %cmp2 = icmp slt i32 %add8, 64
+ br i1 %cmp2, label %for.body3, label %for.inc9
+
+for.inc9:
+ %add10 = add nsw i32 %i.021, %n
+ %cmp = icmp slt i32 %add10, 64
+ br i1 %cmp, label %for.cond1.preheader, label %for.end11
+
+for.end11:
+ ret i32 %add7
+}
+
More information about the llvm-commits
mailing list