[llvm] r371048 - [SystemZ] Recognize INLINEASM_BR in backend

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 5 04:31:50 PDT 2019


Merged to release_90 in r371057.

On Thu, Sep 5, 2019 at 12:18 PM Jonas Paulsson via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: jonpa
> Date: Thu Sep  5 03:20:05 2019
> New Revision: 371048
>
> URL: http://llvm.org/viewvc/llvm-project?rev=371048&view=rev
> Log:
> [SystemZ]  Recognize INLINEASM_BR in backend
>
> Handle the remaining cases also by handling asm goto in
> SystemZInstrInfo::getBranchInfo().
>
> Review: Ulrich Weigand
> https://reviews.llvm.org/D67151
>
> Modified:
>     llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.cpp
>     llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.h
>     llvm/trunk/lib/Target/SystemZ/SystemZLongBranch.cpp
>     llvm/trunk/lib/Target/SystemZ/SystemZMachineScheduler.cpp
>     llvm/trunk/test/CodeGen/SystemZ/asm-20.ll
>
> Modified: llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.cpp?rev=371048&r1=371047&r2=371048&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.cpp (original)
> +++ llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.cpp Thu Sep  5 03:20:05 2019
> @@ -462,13 +462,13 @@ bool SystemZInstrInfo::analyzeBranch(Mac
>        break;
>
>      // A terminator that isn't a branch can't easily be handled by this
> -    // analysis.  Asm goto is not understood / optimized.
> -    if (!I->isBranch() || I->getOpcode() == SystemZ::INLINEASM_BR)
> +    // analysis.
> +    if (!I->isBranch())
>        return true;
>
>      // Can't handle indirect branches.
>      SystemZII::Branch Branch(getBranchInfo(*I));
> -    if (!Branch.Target->isMBB())
> +    if (!Branch.hasMBBTarget())
>        return true;
>
>      // Punt on compound branches.
> @@ -478,7 +478,7 @@ bool SystemZInstrInfo::analyzeBranch(Mac
>      if (Branch.CCMask == SystemZ::CCMASK_ANY) {
>        // Handle unconditional branches.
>        if (!AllowModify) {
> -        TBB = Branch.Target->getMBB();
> +        TBB = Branch.getMBBTarget();
>          continue;
>        }
>
> @@ -490,7 +490,7 @@ bool SystemZInstrInfo::analyzeBranch(Mac
>        FBB = nullptr;
>
>        // Delete the JMP if it's equivalent to a fall-through.
> -      if (MBB.isLayoutSuccessor(Branch.Target->getMBB())) {
> +      if (MBB.isLayoutSuccessor(Branch.getMBBTarget())) {
>          TBB = nullptr;
>          I->eraseFromParent();
>          I = MBB.end();
> @@ -498,7 +498,7 @@ bool SystemZInstrInfo::analyzeBranch(Mac
>        }
>
>        // TBB is used to indicate the unconditinal destination.
> -      TBB = Branch.Target->getMBB();
> +      TBB = Branch.getMBBTarget();
>        continue;
>      }
>
> @@ -506,7 +506,7 @@ bool SystemZInstrInfo::analyzeBranch(Mac
>      if (Cond.empty()) {
>        // FIXME: add X86-style branch swap
>        FBB = TBB;
> -      TBB = Branch.Target->getMBB();
> +      TBB = Branch.getMBBTarget();
>        Cond.push_back(MachineOperand::CreateImm(Branch.CCValid));
>        Cond.push_back(MachineOperand::CreateImm(Branch.CCMask));
>        continue;
> @@ -517,7 +517,7 @@ bool SystemZInstrInfo::analyzeBranch(Mac
>
>      // Only handle the case where all conditional branches branch to the same
>      // destination.
> -    if (TBB != Branch.Target->getMBB())
> +    if (TBB != Branch.getMBBTarget())
>        return true;
>
>      // If the conditions are the same, we can leave them alone.
> @@ -547,7 +547,7 @@ unsigned SystemZInstrInfo::removeBranch(
>        continue;
>      if (!I->isBranch())
>        break;
> -    if (!getBranchInfo(*I).Target->isMBB())
> +    if (!getBranchInfo(*I).hasMBBTarget())
>        break;
>      // Remove the branch.
>      I->eraseFromParent();
> @@ -1546,6 +1546,10 @@ SystemZInstrInfo::getBranchInfo(const Ma
>      return SystemZII::Branch(SystemZII::BranchCLG, SystemZ::CCMASK_ICMP,
>                               MI.getOperand(2).getImm(), &MI.getOperand(3));
>
> +  case SystemZ::INLINEASM_BR:
> +    // Don't try to analyze asm goto, so pass nullptr as branch target argument.
> +    return SystemZII::Branch(SystemZII::AsmGoto, 0, 0, nullptr);
> +
>    default:
>      llvm_unreachable("Unrecognized branch opcode");
>    }
>
> Modified: llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.h?rev=371048&r1=371047&r2=371048&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.h (original)
> +++ llvm/trunk/lib/Target/SystemZ/SystemZInstrInfo.h Thu Sep  5 03:20:05 2019
> @@ -100,11 +100,18 @@ enum BranchType {
>
>    // An instruction that decrements a 64-bit register and branches if
>    // the result is nonzero.
> -  BranchCTG
> +  BranchCTG,
> +
> +  // An instruction representing an asm goto statement.
> +  AsmGoto
>  };
>
>  // Information about a branch instruction.
> -struct Branch {
> +class Branch {
> +  // The target of the branch. In case of INLINEASM_BR, this is nullptr.
> +  const MachineOperand *Target;
> +
> +public:
>    // The type of the branch.
>    BranchType Type;
>
> @@ -114,12 +121,15 @@ struct Branch {
>    // CCMASK_<N> is set if the branch should be taken when CC == N.
>    unsigned CCMask;
>
> -  // The target of the branch.
> -  const MachineOperand *Target;
> -
>    Branch(BranchType type, unsigned ccValid, unsigned ccMask,
>           const MachineOperand *target)
> -    : Type(type), CCValid(ccValid), CCMask(ccMask), Target(target) {}
> +    : Target(target), Type(type), CCValid(ccValid), CCMask(ccMask) {}
> +
> +  bool isIndirect() { return Target != nullptr && Target->isReg(); }
> +  bool hasMBBTarget() { return Target != nullptr && Target->isMBB(); }
> +  MachineBasicBlock *getMBBTarget() {
> +    return hasMBBTarget() ? Target->getMBB() : nullptr;
> +  }
>  };
>
>  // Kinds of fused compares in compare-and-* instructions.  Together with type
>
> Modified: llvm/trunk/lib/Target/SystemZ/SystemZLongBranch.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/SystemZLongBranch.cpp?rev=371048&r1=371047&r2=371048&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/SystemZ/SystemZLongBranch.cpp (original)
> +++ llvm/trunk/lib/Target/SystemZ/SystemZLongBranch.cpp Thu Sep  5 03:20:05 2019
> @@ -258,7 +258,7 @@ TerminatorInfo SystemZLongBranch::descri
>      }
>      Terminator.Branch = &MI;
>      Terminator.TargetBlock =
> -      TII->getBranchInfo(MI).Target->getMBB()->getNumber();
> +      TII->getBranchInfo(MI).getMBBTarget()->getNumber();
>    }
>    return Terminator;
>  }
>
> Modified: llvm/trunk/lib/Target/SystemZ/SystemZMachineScheduler.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/SystemZMachineScheduler.cpp?rev=371048&r1=371047&r2=371048&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/SystemZ/SystemZMachineScheduler.cpp (original)
> +++ llvm/trunk/lib/Target/SystemZ/SystemZMachineScheduler.cpp Thu Sep  5 03:20:05 2019
> @@ -108,8 +108,8 @@ void SystemZPostRASchedStrategy::enterMB
>         I != SinglePredMBB->end(); I++) {
>      LLVM_DEBUG(dbgs() << "** Emitting incoming branch: "; I->dump(););
>      bool TakenBranch = (I->isBranch() &&
> -      (TII->getBranchInfo(*I).Target->isReg() || // Relative branch
> -       TII->getBranchInfo(*I).Target->getMBB() == MBB));
> +                        (TII->getBranchInfo(*I).isIndirect() ||
> +                         TII->getBranchInfo(*I).getMBBTarget() == MBB));
>      HazardRec->emitInstruction(&*I, TakenBranch);
>      if (TakenBranch)
>        break;
>
> Modified: llvm/trunk/test/CodeGen/SystemZ/asm-20.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/SystemZ/asm-20.ll?rev=371048&r1=371047&r2=371048&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/SystemZ/asm-20.ll (original)
> +++ llvm/trunk/test/CodeGen/SystemZ/asm-20.ll Thu Sep  5 03:20:05 2019
> @@ -1,10 +1,10 @@
>  ; Test that asm goto can be compiled.
>  ;
> -; RUN: llc < %s -mtriple=s390x-linux-gnu
> +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14
>
>  define i32 @c() {
>  entry:
> -  callbr void asm sideeffect "", "X"(i8* blockaddress(@c, %d))
> +  callbr void asm sideeffect "j d", "X"(i8* blockaddress(@c, %d))
>            to label %asm.fallthrough [label %d]
>
>  asm.fallthrough:               ; preds = %entry
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list