================ @@ -0,0 +1,87 @@ +//===- OffloadBlockUniformity.cpp - Offload block uniformity info +//----------===// +// +// 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/OffloadBlockUniformity.h" +#include "llvm/CodeGen/MachineBasicBlock.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/IR/BasicBlock.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/Instruction.h" +#include "llvm/IR/Metadata.h" +#include <optional> + +using namespace llvm; + +static std::optional<bool> getIRBlockUniformity(const BasicBlock &BB) { + const Instruction *TI = BB.getTerminator(); + if (!TI) + return std::nullopt; + + MDNode *MD = TI->getMetadata(OffloadBlockUniformityInfo::MetadataName); + if (!MD || MD->getNumOperands() != 1) + return std::nullopt; + + const auto *CI = mdconst::extract_or_null<ConstantInt>(MD->getOperand(0)); + if (!CI) + return std::nullopt; + return CI->isOne(); +} + +void OffloadBlockUniformityInfo::compute(const MachineFunction &MF) { + HasAnyUniformity = false; + DivergentBlocks.clear(); + DivergentBlocks.resize(MF.getNumBlockIDs()); + + // First determine whether any uniformity annotation exists for this function. + for (const MachineBasicBlock &MBB : MF) { + const BasicBlock *BB = MBB.getBasicBlock(); ---------------- arsenm wrote:
Why does this need to look at the IR block? I thought the way this usually worked is the profile metadata is attached to machine instructions. Machine passes can retain those through block splits etc. https://github.com/llvm/llvm-project/pull/177665 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
