[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