[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