[llvm] r220987 - [AArch64] Check Dest Register Liveness in CondOpt pass.
Sean Silva
chisophugis at gmail.com
Fri Oct 31 17:43:38 PDT 2014
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:
>
> cmp x17, #3
> b.lt .LBB10_15
> ...
> subs x12, x12, #1
> b.gt .LBB10_1
>
> where x12 is a liveout, becomes:
>
> cmp x17, #2
> b.le .LBB10_15
> ...
> subs x12, x12, #2
> b.ge .LBB10_1
>
>
?
Is <= and >= somehow better than < and > ?
-- Sean Silva
> 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:
> 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 @@
> #include "llvm/ADT/DepthFirstIterator.h"
> #include "llvm/ADT/SmallVector.h"
> #include "llvm/ADT/Statistic.h"
> +#include "llvm/CodeGen/LiveIntervalAnalysis.h"
> #include "llvm/CodeGen/MachineDominators.h"
> #include "llvm/CodeGen/MachineFunction.h"
> #include "llvm/CodeGen/MachineFunctionPass.h"
> @@ -115,6 +116,7 @@ void initializeAArch64ConditionOptimizer
> INITIALIZE_PASS_BEGIN(AArch64ConditionOptimizer, "aarch64-condopt",
> "AArch64 CondOpt Pass", false, false)
> INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
> +INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
> INITIALIZE_PASS_END(AArch64ConditionOptimizer, "aarch64-condopt",
> "AArch64 CondOpt Pass", false, false)
>
> @@ -125,6 +127,8 @@ FunctionPass *llvm::createAArch64Conditi
> void AArch64ConditionOptimizer::getAnalysisUsage(AnalysisUsage &AU) const
> {
> AU.addRequired<MachineDominatorTree>();
> AU.addPreserved<MachineDominatorTree>();
> + AU.addRequired<LiveIntervals>();
> + AU.addPreserved<LiveIntervals>();
> MachineFunctionPass::getAnalysisUsage(AU);
> }
>
> @@ -134,13 +138,11 @@ void AArch64ConditionOptimizer::getAnaly
> MachineInstr *AArch64ConditionOptimizer::findSuitableCompare(
> MachineBasicBlock *MBB) {
> MachineBasicBlock::iterator I = MBB->getFirstTerminator();
> - if (I == MBB->end()) {
> + if (I == MBB->end())
> return nullptr;
> - }
>
> - if (I->getOpcode() != AArch64::Bcc) {
> - return nullptr;
> - }
> + if (I->getOpcode() != AArch64::Bcc)
> + return nullptr;
>
> // Now find the instruction controlling the terminator.
> for (MachineBasicBlock::iterator B = MBB->begin(); I != B;) {
> @@ -153,7 +155,11 @@ MachineInstr *AArch64ConditionOptimizer:
> // cmn is an alias for adds with a dead destination register.
> case AArch64::ADDSWri:
> case AArch64::ADDSXri:
> - return I;
> + if (I->getOperand(0).isDead())
> + return I;
> +
> + DEBUG(dbgs() << "Destination of cmp is not dead, " << *I << '\n');
> + return nullptr;
>
> // Prevent false positive case like:
> // cmp w19, #0
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141031/d1fd1c58/attachment.html>
More information about the llvm-commits
mailing list