From 08be9074894e8c7cca9bfec898796038e7065080 Mon Sep 17 00:00:00 2001 From: James Molloy Date: Mon, 3 Aug 2015 09:24:48 +0000 Subject: [PATCH] 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 llvm-svn: 243869 --- lib/Target/ARM/ARMBaseInstrInfo.cpp | 2 +- test/CodeGen/ARM/thumb2-it-block.ll | 24 ++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/lib/Target/ARM/ARMBaseInstrInfo.cpp b/lib/Target/ARM/ARMBaseInstrInfo.cpp index 9f43e732bd7..3eb21ad7077 100644 --- a/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -518,7 +518,7 @@ bool ARMBaseInstrInfo::DefinesPredicate(MachineInstr *MI, 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; } diff --git a/test/CodeGen/ARM/thumb2-it-block.ll b/test/CodeGen/ARM/thumb2-it-block.ll index 2675a733da9..aaefc0a1486 100644 --- a/test/CodeGen/ARM/thumb2-it-block.ll +++ b/test/CodeGen/ARM/thumb2-it-block.ll @@ -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