forked from oneapi-src/SYCLomatic
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement convergence control in MIR using SelectionDAG (#71785)
LLVM function calls carry convergence control tokens as operand bundles, where the tokens themselves are produced by convergence control intrinsics. This patch implements convergence control tokens in MIR as follows: 1. Introduce target-independent ISD opcodes and MIR opcodes for convergence control intrinsics. 2. Model token values as untyped virtual registers in MIR. The change also introduces an additional ISD opcode CONVERGENCECTRL_GLUE and a corresponding machine opcode with the same spelling. This glues the convergence control token to SDNodes that represent calls to intrinsics. The glued token is later translated to an implicit argument in the MIR. The lowering of calls to user-defined functions is target-specific. On AMDGPU, the convergence control operand bundle at a non-intrinsic call is translated to an explicit argument to the SI_CALL_ISEL instruction. Post-selection adjustment converts this explicit argument to an implicit argument on the SI_CALL instruction.
- Loading branch information
Showing
52 changed files
with
831 additions
and
162 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
//===- MachineConvergenceVerifier.h - Verify convergenctrl ------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
/// \file | ||
/// | ||
/// This file declares the MIR specialization of the GenericConvergenceVerifier | ||
/// template. | ||
/// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_CODEGEN_MACHINECONVERGENCEVERIFIER_H | ||
#define LLVM_CODEGEN_MACHINECONVERGENCEVERIFIER_H | ||
|
||
#include "llvm/ADT/GenericConvergenceVerifier.h" | ||
#include "llvm/CodeGen/MachineSSAContext.h" | ||
|
||
namespace llvm { | ||
|
||
using MachineConvergenceVerifier = | ||
GenericConvergenceVerifier<MachineSSAContext>; | ||
|
||
} // namespace llvm | ||
|
||
#endif // LLVM_CODEGEN_MACHINECONVERGENCEVERIFIER_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
//===- ConvergenceVerifier.cpp - Verify convergence control -----*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "llvm/CodeGen/MachineConvergenceVerifier.h" | ||
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h" | ||
#include "llvm/CodeGen/MachineDominators.h" | ||
#include "llvm/CodeGen/MachineRegisterInfo.h" | ||
#include "llvm/CodeGen/MachineSSAContext.h" | ||
#include "llvm/IR/GenericConvergenceVerifierImpl.h" | ||
|
||
using namespace llvm; | ||
|
||
template <> | ||
auto GenericConvergenceVerifier<MachineSSAContext>::getConvOp( | ||
const MachineInstr &MI) -> ConvOpKind { | ||
switch (MI.getOpcode()) { | ||
default: | ||
return CONV_NONE; | ||
case TargetOpcode::CONVERGENCECTRL_ENTRY: | ||
return CONV_ENTRY; | ||
case TargetOpcode::CONVERGENCECTRL_ANCHOR: | ||
return CONV_ANCHOR; | ||
case TargetOpcode::CONVERGENCECTRL_LOOP: | ||
return CONV_LOOP; | ||
} | ||
} | ||
|
||
template <> | ||
const MachineInstr * | ||
GenericConvergenceVerifier<MachineSSAContext>::findAndCheckConvergenceTokenUsed( | ||
const MachineInstr &MI) { | ||
const MachineRegisterInfo &MRI = Context.getFunction()->getRegInfo(); | ||
const MachineInstr *TokenDef = nullptr; | ||
|
||
for (const MachineOperand &MO : MI.uses()) { | ||
if (!MO.isReg()) | ||
continue; | ||
Register OpReg = MO.getReg(); | ||
if (!OpReg.isVirtual()) | ||
continue; | ||
|
||
const MachineInstr *Def = MRI.getVRegDef(OpReg); | ||
if (!Def) | ||
continue; | ||
if (getConvOp(*Def) == CONV_NONE) | ||
continue; | ||
|
||
CheckOrNull( | ||
MI.isConvergent(), | ||
"Convergence control tokens can only be used by convergent operations.", | ||
{Context.print(OpReg), Context.print(&MI)}); | ||
|
||
CheckOrNull(!TokenDef, | ||
"An operation can use at most one convergence control token.", | ||
{Context.print(OpReg), Context.print(&MI)}); | ||
|
||
TokenDef = Def; | ||
} | ||
|
||
if (TokenDef) | ||
Tokens[&MI] = TokenDef; | ||
|
||
return TokenDef; | ||
} | ||
|
||
template <> | ||
bool GenericConvergenceVerifier<MachineSSAContext>::isInsideConvergentFunction( | ||
const MachineInstr &MI) { | ||
// The class MachineFunction does not have any property to indicate whether it | ||
// is convergent. Trivially return true so that the check always passes. | ||
return true; | ||
} | ||
|
||
template <> | ||
bool GenericConvergenceVerifier<MachineSSAContext>::isConvergent( | ||
const MachineInstr &MI) { | ||
return MI.isConvergent(); | ||
} | ||
|
||
template class llvm::GenericConvergenceVerifier<MachineSSAContext>; |
Oops, something went wrong.