Skip to content

Commit

Permalink
Move SIMD alignment calculation to LLVM Frontend
Browse files Browse the repository at this point in the history
Currently default simd alignment is defined by Clang specific TargetInfo class.
This class cannot be reused for LLVM Flang. That's why default simd alignment
calculation has been moved to OMPIRBuilder which is common for Flang and Clang.

Previous attempt: https://reviews.llvm.org/D138496 was wrong because
the default alignment depended on the number of built LLVM targets.

If we wanted to calculate the default alignment for PPC and we hadn't specified
PPC LLVM target to build, then we would get 0 as the alignment because
OMPIRBuilder couldn't create PPCTargetMachine object and it returned 0 as
the default value.

If PPC LLVM target had been built earlier, then OMPIRBuilder could have created
PPCTargetMachine object and it would have returned 128.

Differential Revision: https://reviews.llvm.org/D141910

Reviewed By: jdoerfert
  • Loading branch information
DominikAdamski committed Feb 10, 2023
1 parent c77c186 commit baca3c1
Show file tree
Hide file tree
Showing 10 changed files with 28 additions and 14 deletions.
5 changes: 0 additions & 5 deletions clang/include/clang/Basic/TargetInfo.h
Expand Up @@ -225,7 +225,6 @@ class TargetInfo : public virtual TransferrableTargetInfo,
bool HasStrictFP;

unsigned char MaxAtomicPromoteWidth, MaxAtomicInlineWidth;
unsigned short SimdDefaultAlign;
std::string DataLayoutString;
const char *UserLabelPrefix;
const char *MCountName;
Expand Down Expand Up @@ -794,10 +793,6 @@ class TargetInfo : public virtual TransferrableTargetInfo,

/// Return the maximum vector alignment supported for the given target.
unsigned getMaxVectorAlign() const { return MaxVectorAlign; }
/// Return default simd alignment for the given target. Generally, this
/// value is type-specific, but this alignment can be used for most of the
/// types for the given target.
unsigned getSimdDefaultAlign() const { return SimdDefaultAlign; }

unsigned getMaxOpenCLWorkGroupSize() const { return MaxOpenCLWorkGroupSize; }

Expand Down
4 changes: 3 additions & 1 deletion clang/lib/AST/ASTContext.cpp
Expand Up @@ -77,6 +77,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
#include "llvm/Support/Capacity.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
Expand Down Expand Up @@ -2539,7 +2540,8 @@ unsigned ASTContext::getTypeUnadjustedAlign(const Type *T) const {
}

unsigned ASTContext::getOpenMPDefaultSimdAlign(QualType T) const {
unsigned SimdAlign = getTargetInfo().getSimdDefaultAlign();
unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
getTargetInfo().getTriple(), Target->getTargetOpts().FeatureMap);
return SimdAlign;
}

Expand Down
1 change: 1 addition & 0 deletions clang/lib/AST/CMakeLists.txt
Expand Up @@ -132,4 +132,5 @@ add_clang_library(clangAST
ClangAttrDocTable
Opcodes
omp_gen
intrinsics_gen
)
1 change: 0 additions & 1 deletion clang/lib/Basic/TargetInfo.cpp
Expand Up @@ -119,7 +119,6 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
MaxVectorAlign = 0;
MaxTLSAlign = 0;
SimdDefaultAlign = 0;
SizeType = UnsignedLong;
PtrDiffType = SignedLong;
IntMaxType = SignedLongLong;
Expand Down
1 change: 0 additions & 1 deletion clang/lib/Basic/Targets/PPC.h
Expand Up @@ -87,7 +87,6 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo {
PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
: TargetInfo(Triple) {
SuitableAlign = 128;
SimdDefaultAlign = 128;
LongDoubleWidth = LongDoubleAlign = 128;
LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
HasStrictFP = true;
Expand Down
1 change: 0 additions & 1 deletion clang/lib/Basic/Targets/WebAssembly.h
Expand Up @@ -49,7 +49,6 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
SuitableAlign = 128;
LargeArrayMinWidth = 128;
LargeArrayAlign = 128;
SimdDefaultAlign = 128;
SigAtomicType = SignedLong;
LongDoubleWidth = LongDoubleAlign = 128;
LongDoubleFormat = &llvm::APFloat::IEEEquad();
Expand Down
3 changes: 0 additions & 3 deletions clang/lib/Basic/Targets/X86.cpp
Expand Up @@ -400,9 +400,6 @@ bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
return false;
}

SimdDefaultAlign =
hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;

// FIXME: We should allow long double type on 32-bits to match with GCC.
// This requires backend to be able to lower f80 without x87 first.
if (!HasX87 && LongDoubleFormat == &llvm::APFloat::x87DoubleExtended())
Expand Down
Expand Up @@ -500,8 +500,6 @@ ClangExpressionParser::ClangExpressionParser(
auto target_info = TargetInfo::CreateTargetInfo(
m_compiler->getDiagnostics(), m_compiler->getInvocation().TargetOpts);
if (log) {
LLDB_LOGF(log, "Using SIMD alignment: %d",
target_info->getSimdDefaultAlign());
LLDB_LOGF(log, "Target datalayout string: '%s'",
target_info->getDataLayoutString());
LLDB_LOGF(log, "Target ABI: '%s'", target_info->getABI().str().c_str());
Expand Down
7 changes: 7 additions & 0 deletions llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
Expand Up @@ -502,6 +502,13 @@ class OpenMPIRBuilder {
ArrayRef<CanonicalLoopInfo *> Loops,
InsertPointTy ComputeIP);

/// Get the default alignment value for given target
///
/// \param TargetTriple Target triple
/// \param Features StringMap which describes extra CPU features
static unsigned getOpenMPDefaultSimdAlign(const Triple &TargetTriple,
const StringMap<bool> &Features);

private:
/// Modifies the canonical loop to be a statically-scheduled workshare loop.
///
Expand Down
17 changes: 17 additions & 0 deletions llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
Expand Up @@ -3053,6 +3053,23 @@ void OpenMPIRBuilder::createIfVersion(CanonicalLoopInfo *CanonicalLoop,
Builder.CreateBr(NewBlocks.front());
}

unsigned
OpenMPIRBuilder::getOpenMPDefaultSimdAlign(const Triple &TargetTriple,
const StringMap<bool> &Features) {
if (TargetTriple.isX86()) {
if (Features.lookup("avx512f"))
return 512;
else if (Features.lookup("avx"))
return 256;
return 128;
}
if (TargetTriple.isPPC())
return 128;
if (TargetTriple.isWasm())
return 128;
return 0;
}

void OpenMPIRBuilder::applySimd(CanonicalLoopInfo *CanonicalLoop,
MapVector<Value *, Value *> AlignedVars,
Value *IfCond, OrderKind Order,
Expand Down

0 comments on commit baca3c1

Please sign in to comment.