[llvm] r243869 - Be less conservative about forming IT blocks.
James Molloy
james.molloy at arm.com
Mon Aug 3 02:24:48 PDT 2015
Author: jamesm
Date: Mon Aug 3 04:24:48 2015
New Revision: 243869
URL: http://llvm.org/viewvc/llvm-project?rev=243869&view=rev
Log:
Be less conservative about forming IT blocks.
In http://reviews.llvm.org/rL215382, IT forming was made more conservative under
the belief that a flag-setting instruction was unpredictable inside an IT block on ARMv6M.
But actually, ARMv6M doesn't even support IT blocks so that's impossible. In the ARMARM for
v7M, v7AR and v8AR it states that the semantics of such an instruction changes inside an
IT block - it doesn't set the flags. So actually it is fine to use one inside an IT block
as long as the flags register is dead afterwards.
This gives significant performance improvements in a variety of MPEG based workloads.
Differential revision: http://reviews.llvm.org/D11680
Modified:
llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
llvm/trunk/test/CodeGen/ARM/thumb2-it-block.ll
Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=243869&r1=243868&r2=243869&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp Mon Aug 3 04:24:48 2015
@@ -518,7 +518,7 @@ bool ARMBaseInstrInfo::DefinesPredicate(
static bool isCPSRDefined(const MachineInstr *MI) {
for (const auto &MO : MI->operands())
- if (MO.isReg() && MO.getReg() == ARM::CPSR && MO.isDef())
+ if (MO.isReg() && MO.getReg() == ARM::CPSR && MO.isDef() && !MO.isDead())
return true;
return false;
}
Modified: llvm/trunk/test/CodeGen/ARM/thumb2-it-block.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/thumb2-it-block.ll?rev=243869&r1=243868&r2=243869&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/thumb2-it-block.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/thumb2-it-block.ll Mon Aug 3 04:24:48 2015
@@ -1,5 +1,5 @@
-; RUN: llc -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 %s -o - | FileCheck -check-prefix CHECK-V7 %s
-; RUN: llc -mtriple=thumbv8 %s -o - | FileCheck %s -check-prefix CHECK-V8
+; RUN: llc -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 %s -o - | FileCheck %s
+; RUN: llc -mtriple=thumbv8 %s -o - | FileCheck %s
; PR11107
define i32 @test(i32 %a, i32 %b) {
@@ -14,17 +14,13 @@ entry:
ret i32 %add
}
-; CHECK-V7: cmp
-; CHECK-V7-NEXT: it mi
-; CHECK-V7-NEXT: rsbmi
-; CHECK-V7-NEXT: cmp
-; CHECK-V7-NEXT: it mi
-; CHECK-V7-NEXT: rsbmi
+; CHECK: cmp
+; CHECK-NEXT: it mi
+; We shouldn't need to check for the extra 's' here; tRSB should be printed as
+; "rsb" inside an IT block, not "rsbs".
+; CHECK-NEXT: rsb{{s?}}mi
+; CHECK-NEXT: cmp
+; CHECK-NEXT: it mi
+; CHECK-NEXT: rsb{{s?}}mi
-; CHECK-V8: cmp
-; CHECK-V8-NEXT: bpl
-; CHECK-V8: rsbs
-; CHECK-V8: cmp
-; CHECK-V8-NEXT: bpl
-; CHECK-V8: rsbs
More information about the llvm-commits
mailing list