[llvm] r220987 - [AArch64] Check Dest Register Liveness in CondOpt pass.
Sergey Dmitrouk
sdmitrouk at accesssoftek.com
Mon Nov 3 01:48:04 PST 2014
> Is <= and >= somehow better than < and > ?
Description should have x12 in both compares (I guess x17 is a typo), in
which case if two comparison instructions become equal CSE pass can
remove the second one.
--
Sergey
On Fri, Oct 31, 2014 at 05:43:38PM -0700, Sean Silva wrote:
> On Fri, Oct 31, 2014 at 12:02 PM, Chad Rosier <mcrosier at codeaurora.org>
> wrote:
>
> Author: mcrosier
> Date: Fri Oct 31 14:02:38 2014
> New Revision: 220987
>
> URL: http://llvm.org/viewvc/llvm-project?rev=220987&view=rev
> Log:
> [AArch64] Check Dest Register Liveness in CondOpt pass.
>
> Our internal test reveals such case should not be transformed:
>
> A cmp x17, #3
> A b.lt .LBB10_15
> A ...
> A subs x12, x12, #1
> A b.gt .LBB10_1
>
> where x12 is a liveout, becomes:
>
> A cmp x17, #2
> A b.le .LBB10_15
> A ...
> A subs x12, x12, #2
> A b.ge .LBB10_1
>
> ?
> Is <= and >= somehow better than < and > ?
> -- Sean Silva
> A
>
> Unable to provide test case as it's difficult to reproduce on community
> branch.
>
> http://reviews.llvm.org/D6048
> Patch by Zhaoshi Zheng <zhaoshiz at codeaurora.org>!
>
> Modified:
> A A llvm/trunk/lib/Target/AArch64/AArch64ConditionOptimizer.cpp
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64ConditionOptimizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ConditionOptimizer.cpp?rev=220987&r1=220986&r2=220987&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64ConditionOptimizer.cpp
> (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64ConditionOptimizer.cpp Fri Oct
> 31 14:02:38 2014
> @@ -62,6 +62,7 @@
> A #include "llvm/ADT/DepthFirstIterator.h"
> A #include "llvm/ADT/SmallVector.h"
> A #include "llvm/ADT/Statistic.h"
> +#include "llvm/CodeGen/LiveIntervalAnalysis.h"
> A #include "llvm/CodeGen/MachineDominators.h"
> A #include "llvm/CodeGen/MachineFunction.h"
> A #include "llvm/CodeGen/MachineFunctionPass.h"
> @@ -115,6 +116,7 @@ void initializeAArch64ConditionOptimizer
> A INITIALIZE_PASS_BEGIN(AArch64ConditionOptimizer, "aarch64-condopt",
> A A A A A A A A A A A A "AArch64 CondOpt Pass", false, false)
> A INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
> +INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
> A INITIALIZE_PASS_END(AArch64ConditionOptimizer, "aarch64-condopt",
> A A A A A A A A A A A "AArch64 CondOpt Pass", false, false)
>
> @@ -125,6 +127,8 @@ FunctionPass *llvm::createAArch64Conditi
> A void AArch64ConditionOptimizer::getAnalysisUsage(AnalysisUsage &AU)
> const {
> A A AU.addRequired<MachineDominatorTree>();
> A A AU.addPreserved<MachineDominatorTree>();
> +A AU.addRequired<LiveIntervals>();
> +A AU.addPreserved<LiveIntervals>();
> A A MachineFunctionPass::getAnalysisUsage(AU);
> A }
>
> @@ -134,13 +138,11 @@ void AArch64ConditionOptimizer::getAnaly
> A MachineInstr *AArch64ConditionOptimizer::findSuitableCompare(
> A A A MachineBasicBlock *MBB) {
> A A MachineBasicBlock::iterator I = MBB->getFirstTerminator();
> -A if (I == MBB->end()) {
> +A if (I == MBB->end())
> A A A return nullptr;
> -A }
>
> -A if (I->getOpcode() != AArch64::Bcc) {
> -A A A return nullptr;
> -A }
> +A if (I->getOpcode() != AArch64::Bcc)
> +A A return nullptr;
>
> A A // Now find the instruction controlling the terminator.
> A A for (MachineBasicBlock::iterator B = MBB->begin(); I != B;) {
> @@ -153,7 +155,11 @@ MachineInstr *AArch64ConditionOptimizer:
> A A A // cmn is an alias for adds with a dead destination register.
> A A A case AArch64::ADDSWri:
> A A A case AArch64::ADDSXri:
> -A A A return I;
> +A A A if (I->getOperand(0).isDead())
> +A A A A return I;
> +
> +A A A DEBUG(dbgs() << "Destination of cmp is not dead, " << *I <<
> '\n');
> +A A A return nullptr;
>
> A A A // Prevent false positive case like:
> A A A // cmpA A A w19, #0
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list