[llvm-branch-commits] [llvm-branch] r114301 - in /llvm/branches/ggreif/arm-peephole: lib/Target/ARM/ARMBaseInstrInfo.cpp test/CodeGen/ARM/arm-and-tst-peephole.ll
Gabor Greif
ggreif at gmail.com
Sat Sep 18 14:53:12 PDT 2010
Author: ggreif
Date: Sat Sep 18 16:53:12 2010
New Revision: 114301
URL: http://llvm.org/viewvc/llvm-project?rev=114301&view=rev
Log:
look through COPY and expect the AND just behind
this makes the optimization happen on Thumb-2
Modified:
llvm/branches/ggreif/arm-peephole/lib/Target/ARM/ARMBaseInstrInfo.cpp
llvm/branches/ggreif/arm-peephole/test/CodeGen/ARM/arm-and-tst-peephole.ll
Modified: llvm/branches/ggreif/arm-peephole/lib/Target/ARM/ARMBaseInstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/ggreif/arm-peephole/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=114301&r1=114300&r2=114301&view=diff
==============================================================================
--- llvm/branches/ggreif/arm-peephole/lib/Target/ARM/ARMBaseInstrInfo.cpp (original)
+++ llvm/branches/ggreif/arm-peephole/lib/Target/ARM/ARMBaseInstrInfo.cpp Sat Sep 18 16:53:12 2010
@@ -1396,14 +1396,22 @@
return false;
}
-static bool isSuitableForMask(const MachineInstr &MI, unsigned SrcReg,
+static bool isSuitableForMask(MachineInstr *&MI, unsigned SrcReg,
int CmpMask) {
- switch (MI.getOpcode()) {
+ switch (MI->getOpcode()) {
case ARM::ANDri:
case ARM::t2ANDri:
- if (SrcReg == MI.getOperand(1).getReg() &&
- CmpMask == MI.getOperand(2).getImm())
+ if (SrcReg == MI->getOperand(1).getReg() &&
+ CmpMask == MI->getOperand(2).getImm())
return true;
+ break;
+ case ARM::COPY: {
+ // walk down
+ const MachineInstr &Copy = *MI;
+ MachineBasicBlock::iterator a(next(MachineBasicBlock::iterator(MI)));
+ MI = a;
+ return isSuitableForMask(MI, Copy.getOperand(0).getReg(), CmpMask);
+ }
}
return false;
@@ -1428,16 +1436,15 @@
// Masked compares sometimes use the same register as the corresponding 'and'.
if (CmpMask != ~0) {
- if (!isSuitableForMask(*MI, SrcReg, CmpMask)) {
+ if (!isSuitableForMask(MI, SrcReg, CmpMask)) {
MI = 0;
for (MachineRegisterInfo::use_iterator UI = MRI.use_begin(SrcReg),
UE = MRI.use_end(); UI != UE; ++UI) {
if (UI->getParent() != CmpInstr->getParent()) continue;
- MachineInstr &PotentialAND = *UI;
+ MachineInstr *PotentialAND = &*UI;
if (!isSuitableForMask(PotentialAND, SrcReg, CmpMask))
continue;
- SrcReg = PotentialAND.getOperand(0).getReg();
- MI = &PotentialAND;
+ MI = PotentialAND;
break;
}
if (!MI) return false;
Modified: llvm/branches/ggreif/arm-peephole/test/CodeGen/ARM/arm-and-tst-peephole.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/ggreif/arm-peephole/test/CodeGen/ARM/arm-and-tst-peephole.ll?rev=114301&r1=114300&r2=114301&view=diff
==============================================================================
--- llvm/branches/ggreif/arm-peephole/test/CodeGen/ARM/arm-and-tst-peephole.ll (original)
+++ llvm/branches/ggreif/arm-peephole/test/CodeGen/ARM/arm-and-tst-peephole.ll Sat Sep 18 16:53:12 2010
@@ -27,8 +27,7 @@
; THUMB-NEXT: tst r4, r5
; THUMB-NEXT: beq .LBB0_5
-; T2: and lr, r12, #3
-; T2-NEXT: tst.w r12, #3
+; T2: ands r12, r12, #3
; T2-NEXT: beq .LBB0_5
%and = and i32 %0, 3
More information about the llvm-branch-commits
mailing list