mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 08:26:06 +00:00
[OpenMP] Overhaul declare target
handling
This patch fixes various issues with our prior `declare target` handling and extends it to support `omp begin declare target` as well. This started with PR49649 in mind, trying to provide a way for users to avoid the "ref" global use introduced for globals with internal linkage. From there it went down the rabbit hole, e.g., all variables, even `nohost` ones, were emitted into the device code so it was impossible to determine if "ref" was needed late in the game (based on the name only). To make it really useful, `begin declare target` was needed as it can carry the `device_type`. Not emitting variables eagerly had a ripple effect. Finally, the precedence of the (explicit) declare target list items needed to be taken into account, that meant we cannot just look for any declare target attribute to make a decision. This caused the handling of functions to require fixup as well. I tried to clean up things while I was at it, e.g., we should not "parse declarations and defintions" as part of OpenMP parsing, this will always break at some point. Instead, we keep track what region we are in and act on definitions and declarations instead, this is what we do for declare variant and other begin/end directives already. Highlights: - new diagnosis for restrictions specificed in the standard, - delayed emission of globals not mentioned in an explicit list of a declare target, - omission of `nohost` globals on the host and `host` globals on the device, - no explicit parsing of declarations in-between `omp [begin] declare variant` and the corresponding end anymore, regular parsing instead, - precedence for explicit mentions in `declare target` lists over implicit mentions in the declaration-definition-seq, and - `omp allocate` declarations will now replace an earlier emitted global, if necessary. --- Notes: The patch is larger than I hoped but it turns out that most changes do on their own lead to "inconsistent states", which seem less desirable overall. After working through this I feel the standard should remove the explicit declare target forms as the delayed emission is horrible. That said, while we delay things anyway, it seems to me we check too often for the current status even though that is often not sufficient to act upon. There seems to be a lot of duplication that can probably be trimmed down. Eagerly emitting some things seems pretty weak as an argument to keep so much logic around. --- Reviewed By: ABataev Differential Revision: https://reviews.llvm.org/D101030
This commit is contained in:
parent
3f14596700
commit
df729e2b82
@ -3606,6 +3606,7 @@ def OMPDeclareTargetDecl : InheritableAttr {
|
||||
void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const;
|
||||
static llvm::Optional<MapTypeTy>
|
||||
isDeclareTargetDeclaration(const ValueDecl *VD);
|
||||
static llvm::Optional<OMPDeclareTargetDeclAttr*> getActiveAttr(const ValueDecl *VD);
|
||||
static llvm::Optional<DevTypeTy> getDeviceType(const ValueDecl *VD);
|
||||
static llvm::Optional<SourceLocation> getLocation(const ValueDecl *VD);
|
||||
}];
|
||||
|
@ -1314,7 +1314,15 @@ def warn_omp_unknown_assumption_clause_without_args
|
||||
def note_omp_assumption_clause_continue_here
|
||||
: Note<"the ignored tokens spans until here">;
|
||||
def err_omp_declare_target_unexpected_clause: Error<
|
||||
"unexpected '%0' clause, only %select{'to' or 'link'|'to', 'link' or 'device_type'}1 clauses expected">;
|
||||
"unexpected '%0' clause, only %select{'device_type'|'to' or 'link'|'to', 'link' or 'device_type'}1 clauses expected">;
|
||||
def err_omp_begin_declare_target_unexpected_implicit_to_clause: Error<
|
||||
"unexpected '(', only 'to', 'link' or 'device_type' clauses expected for 'begin declare target' directive">;
|
||||
def err_omp_declare_target_unexpected_clause_after_implicit_to: Error<
|
||||
"unexpected clause after an implicit 'to' clause">;
|
||||
def err_omp_declare_target_missing_to_or_link_clause: Error<
|
||||
"expected at least one 'to' or 'link' clause">;
|
||||
def err_omp_declare_target_multiple : Error<
|
||||
"%0 appears multiple times in clauses on the same declare target directive">;
|
||||
def err_omp_expected_clause: Error<
|
||||
"expected at least one clause on '#pragma omp %0' directive">;
|
||||
def err_omp_mapper_illegal_identifier : Error<
|
||||
|
@ -10231,8 +10231,6 @@ def warn_omp_alignment_not_power_of_two : Warning<
|
||||
InGroup<OpenMPClauses>;
|
||||
def err_omp_invalid_target_decl : Error<
|
||||
"%0 used in declare target directive is not a variable or a function name">;
|
||||
def err_omp_declare_target_multiple : Error<
|
||||
"%0 appears multiple times in clauses on the same declare target directive">;
|
||||
def err_omp_declare_target_to_and_link : Error<
|
||||
"%0 must not appear in both clauses 'to' and 'link'">;
|
||||
def warn_omp_not_in_target_context : Warning<
|
||||
|
@ -3181,10 +3181,12 @@ private:
|
||||
/// Parse 'omp end assumes' directive.
|
||||
void ParseOpenMPEndAssumesDirective(SourceLocation Loc);
|
||||
|
||||
/// Parse clauses for '#pragma omp declare target'.
|
||||
DeclGroupPtrTy ParseOMPDeclareTargetClauses();
|
||||
/// Parse clauses for '#pragma omp [begin] declare target'.
|
||||
void ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI);
|
||||
|
||||
/// Parse '#pragma omp end declare target'.
|
||||
void ParseOMPEndDeclareTargetDirective(OpenMPDirectiveKind DKind,
|
||||
void ParseOMPEndDeclareTargetDirective(OpenMPDirectiveKind BeginDKind,
|
||||
OpenMPDirectiveKind EndDKind,
|
||||
SourceLocation Loc);
|
||||
|
||||
/// Skip tokens until a `annot_pragma_openmp_end` was found. Emit a warning if
|
||||
|
@ -10209,8 +10209,31 @@ public:
|
||||
//
|
||||
private:
|
||||
void *VarDataSharingAttributesStack;
|
||||
|
||||
struct DeclareTargetContextInfo {
|
||||
struct MapInfo {
|
||||
OMPDeclareTargetDeclAttr::MapTypeTy MT;
|
||||
SourceLocation Loc;
|
||||
};
|
||||
/// Explicitly listed variables and functions in a 'to' or 'link' clause.
|
||||
llvm::DenseMap<NamedDecl *, MapInfo> ExplicitlyMapped;
|
||||
|
||||
/// The 'device_type' as parsed from the clause.
|
||||
OMPDeclareTargetDeclAttr::DevTypeTy DT = OMPDeclareTargetDeclAttr::DT_Any;
|
||||
|
||||
/// The directive kind, `begin declare target` or `declare target`.
|
||||
OpenMPDirectiveKind Kind;
|
||||
|
||||
/// The directive location.
|
||||
SourceLocation Loc;
|
||||
|
||||
DeclareTargetContextInfo(OpenMPDirectiveKind Kind, SourceLocation Loc)
|
||||
: Kind(Kind), Loc(Loc) {}
|
||||
};
|
||||
|
||||
/// Number of nested '#pragma omp declare target' directives.
|
||||
SmallVector<SourceLocation, 4> DeclareTargetNesting;
|
||||
SmallVector<DeclareTargetContextInfo, 4> DeclareTargetNesting;
|
||||
|
||||
/// Initialization of data-sharing attributes stack.
|
||||
void InitDataSharingAttributesStack();
|
||||
void DestroyDataSharingAttributesStack();
|
||||
@ -10476,19 +10499,28 @@ public:
|
||||
const ValueDecl *getOpenMPDeclareMapperVarName() const;
|
||||
|
||||
/// Called on the start of target region i.e. '#pragma omp declare target'.
|
||||
bool ActOnStartOpenMPDeclareTargetDirective(SourceLocation Loc);
|
||||
/// Called at the end of target region i.e. '#pragme omp end declare target'.
|
||||
void ActOnFinishOpenMPDeclareTargetDirective();
|
||||
bool ActOnStartOpenMPDeclareTargetContext(DeclareTargetContextInfo &DTCI);
|
||||
|
||||
/// Called at the end of target region i.e. '#pragma omp end declare target'.
|
||||
const DeclareTargetContextInfo ActOnOpenMPEndDeclareTargetDirective();
|
||||
|
||||
/// Called once a target context is completed, that can be when a
|
||||
/// '#pragma omp end declare target' was encountered or when a
|
||||
/// '#pragma omp declare target' without declaration-definition-seq was
|
||||
/// encountered.
|
||||
void ActOnFinishedOpenMPDeclareTargetContext(DeclareTargetContextInfo &DTCI);
|
||||
|
||||
/// Searches for the provided declaration name for OpenMP declare target
|
||||
/// directive.
|
||||
NamedDecl *
|
||||
lookupOpenMPDeclareTargetName(Scope *CurScope, CXXScopeSpec &ScopeSpec,
|
||||
const DeclarationNameInfo &Id,
|
||||
NamedDeclSetType &SameDirectiveDecls);
|
||||
NamedDecl *lookupOpenMPDeclareTargetName(Scope *CurScope,
|
||||
CXXScopeSpec &ScopeSpec,
|
||||
const DeclarationNameInfo &Id);
|
||||
|
||||
/// Called on correct id-expression from the '#pragma omp declare target'.
|
||||
void ActOnOpenMPDeclareTargetName(NamedDecl *ND, SourceLocation Loc,
|
||||
OMPDeclareTargetDeclAttr::MapTypeTy MT,
|
||||
OMPDeclareTargetDeclAttr::DevTypeTy DT);
|
||||
|
||||
/// Check declaration inside target region.
|
||||
void
|
||||
checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D,
|
||||
|
@ -141,57 +141,44 @@ void OMPDeclareTargetDeclAttr::printPrettyPragma(
|
||||
OS << ' ' << ConvertMapTypeTyToStr(getMapType());
|
||||
}
|
||||
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy>
|
||||
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(const ValueDecl *VD) {
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr *>
|
||||
OMPDeclareTargetDeclAttr::getActiveAttr(const ValueDecl *VD) {
|
||||
if (!VD->hasAttrs())
|
||||
return llvm::None;
|
||||
unsigned Level = 0;
|
||||
const OMPDeclareTargetDeclAttr *FoundAttr = nullptr;
|
||||
for (const auto *Attr : VD->specific_attrs<OMPDeclareTargetDeclAttr>()) {
|
||||
if (Level < Attr->getLevel()) {
|
||||
OMPDeclareTargetDeclAttr *FoundAttr = nullptr;
|
||||
for (auto *Attr : VD->specific_attrs<OMPDeclareTargetDeclAttr>()) {
|
||||
if (Level <= Attr->getLevel()) {
|
||||
Level = Attr->getLevel();
|
||||
FoundAttr = Attr;
|
||||
}
|
||||
}
|
||||
if (FoundAttr)
|
||||
return FoundAttr->getMapType();
|
||||
return FoundAttr;
|
||||
return llvm::None;
|
||||
}
|
||||
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy>
|
||||
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(const ValueDecl *VD) {
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr *> ActiveAttr = getActiveAttr(VD);
|
||||
if (ActiveAttr.hasValue())
|
||||
return ActiveAttr.getValue()->getMapType();
|
||||
return llvm::None;
|
||||
}
|
||||
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr::DevTypeTy>
|
||||
OMPDeclareTargetDeclAttr::getDeviceType(const ValueDecl *VD) {
|
||||
if (!VD->hasAttrs())
|
||||
return llvm::None;
|
||||
unsigned Level = 0;
|
||||
const OMPDeclareTargetDeclAttr *FoundAttr = nullptr;
|
||||
for (const auto *Attr : VD->specific_attrs<OMPDeclareTargetDeclAttr>()) {
|
||||
if (Level < Attr->getLevel()) {
|
||||
Level = Attr->getLevel();
|
||||
FoundAttr = Attr;
|
||||
}
|
||||
}
|
||||
if (FoundAttr)
|
||||
return FoundAttr->getDevType();
|
||||
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr *> ActiveAttr = getActiveAttr(VD);
|
||||
if (ActiveAttr.hasValue())
|
||||
return ActiveAttr.getValue()->getDevType();
|
||||
return llvm::None;
|
||||
}
|
||||
|
||||
llvm::Optional<SourceLocation>
|
||||
OMPDeclareTargetDeclAttr::getLocation(const ValueDecl *VD) {
|
||||
if (!VD->hasAttrs())
|
||||
return llvm::None;
|
||||
unsigned Level = 0;
|
||||
const OMPDeclareTargetDeclAttr *FoundAttr = nullptr;
|
||||
for (const auto *Attr : VD->specific_attrs<OMPDeclareTargetDeclAttr>()) {
|
||||
if (Level < Attr->getLevel()) {
|
||||
Level = Attr->getLevel();
|
||||
FoundAttr = Attr;
|
||||
}
|
||||
}
|
||||
if (FoundAttr)
|
||||
return FoundAttr->getRange().getBegin();
|
||||
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr *> ActiveAttr = getActiveAttr(VD);
|
||||
if (ActiveAttr.hasValue())
|
||||
return ActiveAttr.getValue()->getRange().getBegin();
|
||||
return llvm::None;
|
||||
}
|
||||
|
||||
|
@ -2613,3 +2613,57 @@ void CodeGenModule::EmitOMPDeclareMapper(const OMPDeclareMapperDecl *D,
|
||||
void CodeGenModule::EmitOMPRequiresDecl(const OMPRequiresDecl *D) {
|
||||
getOpenMPRuntime().processRequiresDirective(D);
|
||||
}
|
||||
|
||||
void CodeGenModule::EmitOMPAllocateDecl(const OMPAllocateDecl *D) {
|
||||
for (const Expr *E : D->varlists()) {
|
||||
const auto *DE = cast<DeclRefExpr>(E);
|
||||
const auto *VD = cast<VarDecl>(DE->getDecl());
|
||||
|
||||
// Skip all but globals.
|
||||
if (!VD->hasGlobalStorage())
|
||||
continue;
|
||||
|
||||
// Check if the global has been materialized yet or not. If not, we are done
|
||||
// as any later generation will utilize the OMPAllocateDeclAttr. However, if
|
||||
// we already emitted the global we might have done so before the
|
||||
// OMPAllocateDeclAttr was attached, leading to the wrong address space
|
||||
// (potentially). While not pretty, common practise is to remove the old IR
|
||||
// global and generate a new one, so we do that here too. Uses are replaced
|
||||
// properly.
|
||||
StringRef MangledName = getMangledName(VD);
|
||||
llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
|
||||
if (!Entry)
|
||||
continue;
|
||||
|
||||
// We can also keep the existing global if the address space is what we
|
||||
// expect it to be, if not, it is replaced.
|
||||
QualType ASTTy = VD->getType();
|
||||
clang::LangAS GVAS = GetGlobalVarAddressSpace(VD);
|
||||
auto TargetAS = getContext().getTargetAddressSpace(GVAS);
|
||||
if (Entry->getType()->getAddressSpace() == TargetAS)
|
||||
continue;
|
||||
|
||||
// Make a new global with the correct type / address space.
|
||||
llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy);
|
||||
llvm::PointerType *PTy = llvm::PointerType::get(Ty, TargetAS);
|
||||
|
||||
// Replace all uses of the old global with a cast. Since we mutate the type
|
||||
// in place we neeed an intermediate that takes the spot of the old entry
|
||||
// until we can create the cast.
|
||||
llvm::GlobalVariable *DummyGV = new llvm::GlobalVariable(
|
||||
getModule(), Entry->getValueType(), false,
|
||||
llvm::GlobalValue::CommonLinkage, nullptr, "dummy", nullptr,
|
||||
llvm::GlobalVariable::NotThreadLocal, Entry->getAddressSpace());
|
||||
Entry->replaceAllUsesWith(DummyGV);
|
||||
|
||||
Entry->mutateType(PTy);
|
||||
llvm::Constant *NewPtrForOldDecl =
|
||||
llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
|
||||
Entry, DummyGV->getType());
|
||||
|
||||
// Now we have a casted version of the changed global, the dummy can be
|
||||
// replaced and deleted.
|
||||
DummyGV->replaceAllUsesWith(NewPtrForOldDecl);
|
||||
DummyGV->eraseFromParent();
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "CGCleanup.h"
|
||||
#include "CGRecordLayout.h"
|
||||
#include "CodeGenFunction.h"
|
||||
#include "clang/AST/APValue.h"
|
||||
#include "clang/AST/Attr.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/OpenMPClause.h"
|
||||
@ -2995,8 +2996,7 @@ void CGOpenMPRuntime::OffloadEntriesInfoManagerTy::
|
||||
if (CGM.getLangOpts().OpenMPIsDevice) {
|
||||
// This could happen if the device compilation is invoked standalone.
|
||||
if (!hasTargetRegionEntryInfo(DeviceID, FileID, ParentName, LineNum))
|
||||
initializeTargetRegionEntryInfo(DeviceID, FileID, ParentName, LineNum,
|
||||
OffloadingEntriesNum);
|
||||
return;
|
||||
auto &Entry =
|
||||
OffloadEntriesTargetRegion[DeviceID][FileID][ParentName][LineNum];
|
||||
Entry.setAddress(Addr);
|
||||
@ -3067,10 +3067,8 @@ void CGOpenMPRuntime::OffloadEntriesInfoManagerTy::
|
||||
if (CGM.getLangOpts().OpenMPIsDevice) {
|
||||
// This could happen if the device compilation is invoked standalone.
|
||||
if (!hasDeviceGlobalVarEntryInfo(VarName))
|
||||
initializeDeviceGlobalVarEntryInfo(VarName, Flags, OffloadingEntriesNum);
|
||||
return;
|
||||
auto &Entry = OffloadEntriesDeviceGlobalVar[VarName];
|
||||
assert((!Entry.getAddress() || Entry.getAddress() == Addr) &&
|
||||
"Resetting with the new address.");
|
||||
if (Entry.getAddress() && hasDeviceGlobalVarEntryInfo(VarName)) {
|
||||
if (Entry.getVarSize().isZero()) {
|
||||
Entry.setVarSize(VarSize);
|
||||
@ -3086,8 +3084,6 @@ void CGOpenMPRuntime::OffloadEntriesInfoManagerTy::
|
||||
auto &Entry = OffloadEntriesDeviceGlobalVar[VarName];
|
||||
assert(Entry.isValid() && Entry.getFlags() == Flags &&
|
||||
"Entry not initialized!");
|
||||
assert((!Entry.getAddress() || Entry.getAddress() == Addr) &&
|
||||
"Resetting with the new address.");
|
||||
if (Entry.getVarSize().isZero()) {
|
||||
Entry.setVarSize(VarSize);
|
||||
Entry.setLinkage(Linkage);
|
||||
@ -10498,17 +10494,28 @@ void CGOpenMPRuntime::scanForTargetRegionsFunctions(const Stmt *S,
|
||||
scanForTargetRegionsFunctions(II, ParentName);
|
||||
}
|
||||
|
||||
static bool isAssumedToBeNotEmitted(const ValueDecl *VD, bool IsDevice) {
|
||||
Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
|
||||
OMPDeclareTargetDeclAttr::getDeviceType(VD);
|
||||
if (!DevTy)
|
||||
return false;
|
||||
// Do not emit device_type(nohost) functions for the host.
|
||||
if (!IsDevice && DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
|
||||
return true;
|
||||
// Do not emit device_type(host) functions for the device.
|
||||
if (IsDevice && DevTy == OMPDeclareTargetDeclAttr::DT_Host)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CGOpenMPRuntime::emitTargetFunctions(GlobalDecl GD) {
|
||||
// If emitting code for the host, we do not process FD here. Instead we do
|
||||
// the normal code generation.
|
||||
if (!CGM.getLangOpts().OpenMPIsDevice) {
|
||||
if (const auto *FD = dyn_cast<FunctionDecl>(GD.getDecl())) {
|
||||
Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
|
||||
OMPDeclareTargetDeclAttr::getDeviceType(FD);
|
||||
// Do not emit device_type(nohost) functions for the host.
|
||||
if (DevTy && *DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
|
||||
if (const auto *FD = dyn_cast<FunctionDecl>(GD.getDecl()))
|
||||
if (isAssumedToBeNotEmitted(cast<ValueDecl>(FD),
|
||||
CGM.getLangOpts().OpenMPIsDevice))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -10517,10 +10524,8 @@ bool CGOpenMPRuntime::emitTargetFunctions(GlobalDecl GD) {
|
||||
if (const auto *FD = dyn_cast<FunctionDecl>(VD)) {
|
||||
StringRef Name = CGM.getMangledName(GD);
|
||||
scanForTargetRegionsFunctions(FD->getBody(), Name);
|
||||
Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
|
||||
OMPDeclareTargetDeclAttr::getDeviceType(FD);
|
||||
// Do not emit device_type(nohost) functions for the host.
|
||||
if (DevTy && *DevTy == OMPDeclareTargetDeclAttr::DT_Host)
|
||||
if (isAssumedToBeNotEmitted(cast<ValueDecl>(FD),
|
||||
CGM.getLangOpts().OpenMPIsDevice))
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -10530,6 +10535,10 @@ bool CGOpenMPRuntime::emitTargetFunctions(GlobalDecl GD) {
|
||||
}
|
||||
|
||||
bool CGOpenMPRuntime::emitTargetGlobalVariable(GlobalDecl GD) {
|
||||
if (isAssumedToBeNotEmitted(cast<ValueDecl>(GD.getDecl()),
|
||||
CGM.getLangOpts().OpenMPIsDevice))
|
||||
return true;
|
||||
|
||||
if (!CGM.getLangOpts().OpenMPIsDevice)
|
||||
return false;
|
||||
|
||||
@ -10602,6 +10611,13 @@ void CGOpenMPRuntime::registerTargetGlobalVariable(const VarDecl *VD,
|
||||
if (CGM.getLangOpts().OMPTargetTriples.empty() &&
|
||||
!CGM.getLangOpts().OpenMPIsDevice)
|
||||
return;
|
||||
|
||||
// If we have host/nohost variables, they do not need to be registered.
|
||||
Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
|
||||
OMPDeclareTargetDeclAttr::getDeviceType(VD);
|
||||
if (DevTy && DevTy.getValue() != OMPDeclareTargetDeclAttr::DT_Any)
|
||||
return;
|
||||
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
|
||||
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
|
||||
if (!Res) {
|
||||
@ -10632,6 +10648,10 @@ void CGOpenMPRuntime::registerTargetGlobalVariable(const VarDecl *VD,
|
||||
Linkage = CGM.getLLVMLinkageVarDefinition(VD, /*IsConstant=*/false);
|
||||
// Temp solution to prevent optimizations of the internal variables.
|
||||
if (CGM.getLangOpts().OpenMPIsDevice && !VD->isExternallyVisible()) {
|
||||
// Do not create a "ref-variable" if the original is not also available
|
||||
// on the host.
|
||||
if (!OffloadEntriesInfoManager.hasDeviceGlobalVarEntryInfo(VarName))
|
||||
return;
|
||||
std::string RefName = getName({VarName, "ref"});
|
||||
if (!CGM.GetGlobalValue(RefName)) {
|
||||
llvm::Constant *AddrRef =
|
||||
|
@ -2669,19 +2669,24 @@ bool CodeGenModule::MustBeEmitted(const ValueDecl *Global) {
|
||||
}
|
||||
|
||||
bool CodeGenModule::MayBeEmittedEagerly(const ValueDecl *Global) {
|
||||
// In OpenMP 5.0 variables and function may be marked as
|
||||
// device_type(host/nohost) and we should not emit them eagerly unless we sure
|
||||
// that they must be emitted on the host/device. To be sure we need to have
|
||||
// seen a declare target with an explicit mentioning of the function, we know
|
||||
// we have if the level of the declare target attribute is -1. Note that we
|
||||
// check somewhere else if we should emit this at all.
|
||||
if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd) {
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
|
||||
OMPDeclareTargetDeclAttr::getActiveAttr(Global);
|
||||
if (!ActiveAttr || (*ActiveAttr)->getLevel() != (unsigned)-1)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (const auto *FD = dyn_cast<FunctionDecl>(Global)) {
|
||||
if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
|
||||
// Implicit template instantiations may change linkage if they are later
|
||||
// explicitly instantiated, so they should not be emitted eagerly.
|
||||
return false;
|
||||
// In OpenMP 5.0 function may be marked as device_type(nohost) and we should
|
||||
// not emit them eagerly unless we sure that the function must be emitted on
|
||||
// the host.
|
||||
if (LangOpts.OpenMP >= 50 && !LangOpts.OpenMPSimd &&
|
||||
!LangOpts.OpenMPIsDevice &&
|
||||
!OMPDeclareTargetDeclAttr::getDeviceType(FD) &&
|
||||
!FD->isUsed(/*CheckUsedAttr=*/false) && !FD->isReferenced())
|
||||
return false;
|
||||
}
|
||||
if (const auto *VD = dyn_cast<VarDecl>(Global))
|
||||
if (Context.getInlineVariableDefinitionKind(VD) ==
|
||||
@ -4362,7 +4367,8 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
|
||||
|
||||
// Replace all uses of the old global with the new global
|
||||
llvm::Constant *NewPtrForOldDecl =
|
||||
llvm::ConstantExpr::getBitCast(GV, Entry->getType());
|
||||
llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV,
|
||||
Entry->getType());
|
||||
Entry->replaceAllUsesWith(NewPtrForOldDecl);
|
||||
|
||||
// Erase the old global, since it is no longer used.
|
||||
@ -5873,6 +5879,7 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) {
|
||||
break;
|
||||
|
||||
case Decl::OMPAllocate:
|
||||
EmitOMPAllocateDecl(cast<OMPAllocateDecl>(D));
|
||||
break;
|
||||
|
||||
case Decl::OMPDeclareReduction:
|
||||
|
@ -1356,6 +1356,10 @@ public:
|
||||
/// \param D Requires declaration
|
||||
void EmitOMPRequiresDecl(const OMPRequiresDecl *D);
|
||||
|
||||
/// Emit a code for the allocate directive.
|
||||
/// \param D The allocate declaration
|
||||
void EmitOMPAllocateDecl(const OMPAllocateDecl *D);
|
||||
|
||||
/// Returns whether the given record has hidden LTO visibility and therefore
|
||||
/// may participate in (single-module) CFI and whole-program vtable
|
||||
/// optimization.
|
||||
|
@ -131,6 +131,7 @@ static OpenMPDirectiveKindExWrapper parseOpenMPDirectiveKind(Parser &P) {
|
||||
{OMPD_declare, OMPD_simd, OMPD_declare_simd},
|
||||
{OMPD_declare, OMPD_target, OMPD_declare_target},
|
||||
{OMPD_declare, OMPD_variant, OMPD_declare_variant},
|
||||
{OMPD_begin_declare, OMPD_target, OMPD_begin_declare_target},
|
||||
{OMPD_begin_declare, OMPD_variant, OMPD_begin_declare_variant},
|
||||
{OMPD_end_declare, OMPD_variant, OMPD_end_declare_variant},
|
||||
{OMPD_distribute, OMPD_parallel, OMPD_distribute_parallel},
|
||||
@ -1664,30 +1665,41 @@ parseOpenMPSimpleClause(Parser &P, OpenMPClauseKind Kind) {
|
||||
return SimpleClauseData(Type, Loc, LOpen, TypeLoc, RLoc);
|
||||
}
|
||||
|
||||
Parser::DeclGroupPtrTy Parser::ParseOMPDeclareTargetClauses() {
|
||||
// OpenMP 4.5 syntax with list of entities.
|
||||
Sema::NamedDeclSetType SameDirectiveDecls;
|
||||
SmallVector<std::tuple<OMPDeclareTargetDeclAttr::MapTypeTy, SourceLocation,
|
||||
NamedDecl *>,
|
||||
4>
|
||||
DeclareTargetDecls;
|
||||
OMPDeclareTargetDeclAttr::DevTypeTy DT = OMPDeclareTargetDeclAttr::DT_Any;
|
||||
void Parser::ParseOMPDeclareTargetClauses(
|
||||
Sema::DeclareTargetContextInfo &DTCI) {
|
||||
SourceLocation DeviceTypeLoc;
|
||||
bool RequiresToOrLinkClause = false;
|
||||
bool HasToOrLinkClause = false;
|
||||
while (Tok.isNot(tok::annot_pragma_openmp_end)) {
|
||||
OMPDeclareTargetDeclAttr::MapTypeTy MT = OMPDeclareTargetDeclAttr::MT_To;
|
||||
if (Tok.is(tok::identifier)) {
|
||||
bool HasIdentifier = Tok.is(tok::identifier);
|
||||
if (HasIdentifier) {
|
||||
// If we see any clause we need a to or link clause.
|
||||
RequiresToOrLinkClause = true;
|
||||
IdentifierInfo *II = Tok.getIdentifierInfo();
|
||||
StringRef ClauseName = II->getName();
|
||||
bool IsDeviceTypeClause =
|
||||
getLangOpts().OpenMP >= 50 &&
|
||||
getOpenMPClauseKind(ClauseName) == OMPC_device_type;
|
||||
// Parse 'to|link|device_type' clauses.
|
||||
if (!OMPDeclareTargetDeclAttr::ConvertStrToMapTypeTy(ClauseName, MT) &&
|
||||
!IsDeviceTypeClause) {
|
||||
|
||||
bool IsToOrLinkClause =
|
||||
OMPDeclareTargetDeclAttr::ConvertStrToMapTypeTy(ClauseName, MT);
|
||||
assert((!IsDeviceTypeClause || !IsToOrLinkClause) && "Cannot be both!");
|
||||
|
||||
if (!IsDeviceTypeClause && DTCI.Kind == OMPD_begin_declare_target) {
|
||||
Diag(Tok, diag::err_omp_declare_target_unexpected_clause)
|
||||
<< ClauseName << (getLangOpts().OpenMP >= 50 ? 1 : 0);
|
||||
<< ClauseName << 0;
|
||||
break;
|
||||
}
|
||||
if (!IsDeviceTypeClause && !IsToOrLinkClause) {
|
||||
Diag(Tok, diag::err_omp_declare_target_unexpected_clause)
|
||||
<< ClauseName << (getLangOpts().OpenMP >= 50 ? 2 : 1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (IsToOrLinkClause)
|
||||
HasToOrLinkClause = true;
|
||||
|
||||
// Parse 'device_type' clause and go to next clause if any.
|
||||
if (IsDeviceTypeClause) {
|
||||
Optional<SimpleClauseData> DevTypeData =
|
||||
@ -1697,16 +1709,17 @@ Parser::DeclGroupPtrTy Parser::ParseOMPDeclareTargetClauses() {
|
||||
// We already saw another device_type clause, diagnose it.
|
||||
Diag(DevTypeData.getValue().Loc,
|
||||
diag::warn_omp_more_one_device_type_clause);
|
||||
break;
|
||||
}
|
||||
switch (static_cast<OpenMPDeviceType>(DevTypeData.getValue().Type)) {
|
||||
case OMPC_DEVICE_TYPE_any:
|
||||
DT = OMPDeclareTargetDeclAttr::DT_Any;
|
||||
DTCI.DT = OMPDeclareTargetDeclAttr::DT_Any;
|
||||
break;
|
||||
case OMPC_DEVICE_TYPE_host:
|
||||
DT = OMPDeclareTargetDeclAttr::DT_Host;
|
||||
DTCI.DT = OMPDeclareTargetDeclAttr::DT_Host;
|
||||
break;
|
||||
case OMPC_DEVICE_TYPE_nohost:
|
||||
DT = OMPDeclareTargetDeclAttr::DT_NoHost;
|
||||
DTCI.DT = OMPDeclareTargetDeclAttr::DT_NoHost;
|
||||
break;
|
||||
case OMPC_DEVICE_TYPE_unknown:
|
||||
llvm_unreachable("Unexpected device_type");
|
||||
@ -1717,37 +1730,47 @@ Parser::DeclGroupPtrTy Parser::ParseOMPDeclareTargetClauses() {
|
||||
}
|
||||
ConsumeToken();
|
||||
}
|
||||
auto &&Callback = [this, MT, &DeclareTargetDecls, &SameDirectiveDecls](
|
||||
CXXScopeSpec &SS, DeclarationNameInfo NameInfo) {
|
||||
NamedDecl *ND = Actions.lookupOpenMPDeclareTargetName(
|
||||
getCurScope(), SS, NameInfo, SameDirectiveDecls);
|
||||
if (ND)
|
||||
DeclareTargetDecls.emplace_back(MT, NameInfo.getLoc(), ND);
|
||||
};
|
||||
if (ParseOpenMPSimpleVarList(OMPD_declare_target, Callback,
|
||||
/*AllowScopeSpecifier=*/true))
|
||||
|
||||
if (DTCI.Kind == OMPD_declare_target || HasIdentifier) {
|
||||
auto &&Callback = [this, MT, &DTCI](CXXScopeSpec &SS,
|
||||
DeclarationNameInfo NameInfo) {
|
||||
NamedDecl *ND =
|
||||
Actions.lookupOpenMPDeclareTargetName(getCurScope(), SS, NameInfo);
|
||||
if (!ND)
|
||||
return;
|
||||
Sema::DeclareTargetContextInfo::MapInfo MI{MT, NameInfo.getLoc()};
|
||||
bool FirstMapping = DTCI.ExplicitlyMapped.try_emplace(ND, MI).second;
|
||||
if (!FirstMapping)
|
||||
Diag(NameInfo.getLoc(), diag::err_omp_declare_target_multiple)
|
||||
<< NameInfo.getName();
|
||||
};
|
||||
if (ParseOpenMPSimpleVarList(OMPD_declare_target, Callback,
|
||||
/*AllowScopeSpecifier=*/true))
|
||||
break;
|
||||
}
|
||||
|
||||
if (Tok.is(tok::l_paren)) {
|
||||
Diag(Tok,
|
||||
diag::err_omp_begin_declare_target_unexpected_implicit_to_clause);
|
||||
break;
|
||||
}
|
||||
if (!HasIdentifier && Tok.isNot(tok::annot_pragma_openmp_end)) {
|
||||
Diag(Tok,
|
||||
diag::err_omp_declare_target_unexpected_clause_after_implicit_to);
|
||||
break;
|
||||
}
|
||||
|
||||
// Consume optional ','.
|
||||
if (Tok.is(tok::comma))
|
||||
ConsumeToken();
|
||||
}
|
||||
|
||||
// For declare target require at least 'to' or 'link' to be present.
|
||||
if (DTCI.Kind == OMPD_declare_target && RequiresToOrLinkClause &&
|
||||
!HasToOrLinkClause)
|
||||
Diag(DTCI.Loc, diag::err_omp_declare_target_missing_to_or_link_clause);
|
||||
|
||||
SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
|
||||
ConsumeAnyToken();
|
||||
for (auto &MTLocDecl : DeclareTargetDecls) {
|
||||
OMPDeclareTargetDeclAttr::MapTypeTy MT;
|
||||
SourceLocation Loc;
|
||||
NamedDecl *ND;
|
||||
std::tie(MT, Loc, ND) = MTLocDecl;
|
||||
// device_type clause is applied only to functions.
|
||||
Actions.ActOnOpenMPDeclareTargetName(
|
||||
ND, Loc, MT, isa<VarDecl>(ND) ? OMPDeclareTargetDeclAttr::DT_Any : DT);
|
||||
}
|
||||
SmallVector<Decl *, 4> Decls(SameDirectiveDecls.begin(),
|
||||
SameDirectiveDecls.end());
|
||||
if (Decls.empty())
|
||||
return DeclGroupPtrTy();
|
||||
return Actions.BuildDeclaratorGroup(Decls);
|
||||
}
|
||||
|
||||
void Parser::skipUntilPragmaOpenMPEnd(OpenMPDirectiveKind DKind) {
|
||||
@ -1784,10 +1807,11 @@ void Parser::parseOMPEndDirective(OpenMPDirectiveKind BeginKind,
|
||||
SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
|
||||
}
|
||||
|
||||
void Parser::ParseOMPEndDeclareTargetDirective(OpenMPDirectiveKind DKind,
|
||||
void Parser::ParseOMPEndDeclareTargetDirective(OpenMPDirectiveKind BeginDKind,
|
||||
OpenMPDirectiveKind EndDKind,
|
||||
SourceLocation DKLoc) {
|
||||
parseOMPEndDirective(OMPD_declare_target, OMPD_end_declare_target, DKind,
|
||||
DKLoc, Tok.getLocation(),
|
||||
parseOMPEndDirective(BeginDKind, OMPD_end_declare_target, EndDKind, DKLoc,
|
||||
Tok.getLocation(),
|
||||
/* SkipUntilOpenMPEnd */ false);
|
||||
// Skip the last annot_pragma_openmp_end.
|
||||
if (Tok.is(tok::annot_pragma_openmp_end))
|
||||
@ -2101,53 +2125,41 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
|
||||
ParseOMPDeclareVariantClauses(Ptr, Toks, Loc);
|
||||
return Ptr;
|
||||
}
|
||||
case OMPD_begin_declare_target:
|
||||
case OMPD_declare_target: {
|
||||
SourceLocation DTLoc = ConsumeAnyToken();
|
||||
if (Tok.isNot(tok::annot_pragma_openmp_end)) {
|
||||
return ParseOMPDeclareTargetClauses();
|
||||
}
|
||||
bool HasClauses = Tok.isNot(tok::annot_pragma_openmp_end);
|
||||
bool HasImplicitMappings =
|
||||
DKind == OMPD_begin_declare_target || !HasClauses;
|
||||
Sema::DeclareTargetContextInfo DTCI(DKind, DTLoc);
|
||||
if (HasClauses)
|
||||
ParseOMPDeclareTargetClauses(DTCI);
|
||||
|
||||
// Skip the last annot_pragma_openmp_end.
|
||||
ConsumeAnyToken();
|
||||
|
||||
if (!Actions.ActOnStartOpenMPDeclareTargetDirective(DTLoc))
|
||||
return DeclGroupPtrTy();
|
||||
|
||||
ParsingOpenMPDirectiveRAII NormalScope(*this, /*Value=*/false);
|
||||
llvm::SmallVector<Decl *, 4> Decls;
|
||||
while (Tok.isNot(tok::eof) && Tok.isNot(tok::r_brace)) {
|
||||
if (Tok.isAnnotation() && Tok.is(tok::annot_pragma_openmp)) {
|
||||
TentativeParsingAction TPA(*this);
|
||||
ConsumeAnnotationToken();
|
||||
DKind = parseOpenMPDirectiveKind(*this);
|
||||
if (DKind != OMPD_end_declare_target)
|
||||
TPA.Revert();
|
||||
else
|
||||
TPA.Commit();
|
||||
}
|
||||
if (DKind == OMPD_end_declare_target)
|
||||
break;
|
||||
DeclGroupPtrTy Ptr;
|
||||
// Here we expect to see some function declaration.
|
||||
if (AS == AS_none) {
|
||||
assert(TagType == DeclSpec::TST_unspecified);
|
||||
MaybeParseCXX11Attributes(Attrs);
|
||||
ParsingDeclSpec PDS(*this);
|
||||
Ptr = ParseExternalDeclaration(Attrs, &PDS);
|
||||
} else {
|
||||
Ptr =
|
||||
ParseCXXClassMemberDeclarationWithPragmas(AS, Attrs, TagType, Tag);
|
||||
}
|
||||
if (Ptr) {
|
||||
DeclGroupRef Ref = Ptr.get();
|
||||
Decls.append(Ref.begin(), Ref.end());
|
||||
}
|
||||
if (HasImplicitMappings) {
|
||||
Actions.ActOnStartOpenMPDeclareTargetContext(DTCI);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ParseOMPEndDeclareTargetDirective(DKind, DTLoc);
|
||||
Actions.ActOnFinishOpenMPDeclareTargetDirective();
|
||||
Actions.ActOnFinishedOpenMPDeclareTargetContext(DTCI);
|
||||
llvm::SmallVector<Decl *, 4> Decls;
|
||||
for (auto &It : DTCI.ExplicitlyMapped)
|
||||
Decls.push_back(It.first);
|
||||
return Actions.BuildDeclaratorGroup(Decls);
|
||||
}
|
||||
case OMPD_end_declare_target: {
|
||||
if (!Actions.isInOpenMPDeclareTargetContext()) {
|
||||
Diag(Tok, diag::err_omp_unexpected_directive)
|
||||
<< 1 << getOpenMPDirectiveName(DKind);
|
||||
break;
|
||||
}
|
||||
const Sema::DeclareTargetContextInfo &DTCI =
|
||||
Actions.ActOnOpenMPEndDeclareTargetDirective();
|
||||
ParseOMPEndDeclareTargetDirective(DTCI.Kind, DKind, DTCI.Loc);
|
||||
return nullptr;
|
||||
}
|
||||
case OMPD_unknown:
|
||||
Diag(Tok, diag::err_omp_unknown_directive);
|
||||
break;
|
||||
@ -2191,7 +2203,6 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
|
||||
case OMPD_parallel_master_taskloop:
|
||||
case OMPD_parallel_master_taskloop_simd:
|
||||
case OMPD_distribute:
|
||||
case OMPD_end_declare_target:
|
||||
case OMPD_target_update:
|
||||
case OMPD_distribute_parallel_for:
|
||||
case OMPD_distribute_parallel_for_simd:
|
||||
@ -2570,6 +2581,7 @@ Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx) {
|
||||
}
|
||||
case OMPD_declare_simd:
|
||||
case OMPD_declare_target:
|
||||
case OMPD_begin_declare_target:
|
||||
case OMPD_end_declare_target:
|
||||
case OMPD_requires:
|
||||
case OMPD_begin_declare_variant:
|
||||
|
@ -18457,7 +18457,7 @@ Sema::FunctionEmissionStatus Sema::getEmissionStatus(FunctionDecl *FD,
|
||||
OMPDeclareTargetDeclAttr::getDeviceType(FD->getCanonicalDecl());
|
||||
// DevTy may be changed later by
|
||||
// #pragma omp declare target to(*) device_type(*).
|
||||
// Therefore DevTyhaving no value does not imply host. The emission status
|
||||
// Therefore DevTy having no value does not imply host. The emission status
|
||||
// will be checked again at the end of compilation unit with Final = true.
|
||||
if (DevTy.hasValue())
|
||||
if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
|
||||
|
@ -2481,8 +2481,8 @@ void Sema::finalizeOpenMPDelayedAnalysis(const FunctionDecl *Caller,
|
||||
Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
|
||||
OMPDeclareTargetDeclAttr::getDeviceType(Caller->getMostRecentDecl());
|
||||
// Ignore host functions during device analyzis.
|
||||
if (LangOpts.OpenMPIsDevice && DevTy &&
|
||||
*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
|
||||
if (LangOpts.OpenMPIsDevice &&
|
||||
(!DevTy || *DevTy == OMPDeclareTargetDeclAttr::DT_Host))
|
||||
return;
|
||||
// Ignore nohost functions during host analyzis.
|
||||
if (!LangOpts.OpenMPIsDevice && DevTy &&
|
||||
@ -19974,7 +19974,8 @@ OMPClause *Sema::ActOnOpenMPDefaultmapClause(
|
||||
OMPDefaultmapClause(StartLoc, LParenLoc, MLoc, KindLoc, EndLoc, Kind, M);
|
||||
}
|
||||
|
||||
bool Sema::ActOnStartOpenMPDeclareTargetDirective(SourceLocation Loc) {
|
||||
bool Sema::ActOnStartOpenMPDeclareTargetContext(
|
||||
DeclareTargetContextInfo &DTCI) {
|
||||
DeclContext *CurLexicalContext = getCurLexicalContext();
|
||||
if (!CurLexicalContext->isFileContext() &&
|
||||
!CurLexicalContext->isExternCContext() &&
|
||||
@ -19983,23 +19984,30 @@ bool Sema::ActOnStartOpenMPDeclareTargetDirective(SourceLocation Loc) {
|
||||
!isa<ClassTemplateDecl>(CurLexicalContext) &&
|
||||
!isa<ClassTemplatePartialSpecializationDecl>(CurLexicalContext) &&
|
||||
!isa<ClassTemplateSpecializationDecl>(CurLexicalContext)) {
|
||||
Diag(Loc, diag::err_omp_region_not_file_context);
|
||||
Diag(DTCI.Loc, diag::err_omp_region_not_file_context);
|
||||
return false;
|
||||
}
|
||||
DeclareTargetNesting.push_back(Loc);
|
||||
DeclareTargetNesting.push_back(DTCI);
|
||||
return true;
|
||||
}
|
||||
|
||||
void Sema::ActOnFinishOpenMPDeclareTargetDirective() {
|
||||
const Sema::DeclareTargetContextInfo
|
||||
Sema::ActOnOpenMPEndDeclareTargetDirective() {
|
||||
assert(!DeclareTargetNesting.empty() &&
|
||||
"Unexpected ActOnFinishOpenMPDeclareTargetDirective");
|
||||
DeclareTargetNesting.pop_back();
|
||||
"check isInOpenMPDeclareTargetContext() first!");
|
||||
return DeclareTargetNesting.pop_back_val();
|
||||
}
|
||||
|
||||
NamedDecl *
|
||||
Sema::lookupOpenMPDeclareTargetName(Scope *CurScope, CXXScopeSpec &ScopeSpec,
|
||||
const DeclarationNameInfo &Id,
|
||||
NamedDeclSetType &SameDirectiveDecls) {
|
||||
void Sema::ActOnFinishedOpenMPDeclareTargetContext(
|
||||
DeclareTargetContextInfo &DTCI) {
|
||||
for (auto &It : DTCI.ExplicitlyMapped)
|
||||
ActOnOpenMPDeclareTargetName(It.first, It.second.Loc, It.second.MT,
|
||||
DTCI.DT);
|
||||
}
|
||||
|
||||
NamedDecl *Sema::lookupOpenMPDeclareTargetName(Scope *CurScope,
|
||||
CXXScopeSpec &ScopeSpec,
|
||||
const DeclarationNameInfo &Id) {
|
||||
LookupResult Lookup(*this, Id, LookupOrdinaryName);
|
||||
LookupParsedName(Lookup, CurScope, &ScopeSpec, true);
|
||||
|
||||
@ -20028,8 +20036,6 @@ Sema::lookupOpenMPDeclareTargetName(Scope *CurScope, CXXScopeSpec &ScopeSpec,
|
||||
Diag(Id.getLoc(), diag::err_omp_invalid_target_decl) << Id.getName();
|
||||
return nullptr;
|
||||
}
|
||||
if (!SameDirectiveDecls.insert(cast<NamedDecl>(ND->getCanonicalDecl())))
|
||||
Diag(Id.getLoc(), diag::err_omp_declare_target_multiple) << Id.getName();
|
||||
return ND;
|
||||
}
|
||||
|
||||
@ -20046,32 +20052,35 @@ void Sema::ActOnOpenMPDeclareTargetName(
|
||||
(ND->isUsed(/*CheckUsedAttr=*/false) || ND->isReferenced()))
|
||||
Diag(Loc, diag::warn_omp_declare_target_after_first_use);
|
||||
|
||||
// Explicit declare target lists have precedence.
|
||||
const unsigned Level = -1;
|
||||
|
||||
auto *VD = cast<ValueDecl>(ND);
|
||||
Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
|
||||
OMPDeclareTargetDeclAttr::getDeviceType(VD);
|
||||
Optional<SourceLocation> AttrLoc = OMPDeclareTargetDeclAttr::getLocation(VD);
|
||||
if (DevTy.hasValue() && *DevTy != DT &&
|
||||
(DeclareTargetNesting.empty() ||
|
||||
*AttrLoc != DeclareTargetNesting.back())) {
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
|
||||
OMPDeclareTargetDeclAttr::getActiveAttr(VD);
|
||||
if (ActiveAttr.hasValue() && ActiveAttr.getValue()->getDevType() != DT &&
|
||||
ActiveAttr.getValue()->getLevel() == Level) {
|
||||
Diag(Loc, diag::err_omp_device_type_mismatch)
|
||||
<< OMPDeclareTargetDeclAttr::ConvertDevTypeTyToStr(DT)
|
||||
<< OMPDeclareTargetDeclAttr::ConvertDevTypeTyToStr(*DevTy);
|
||||
<< OMPDeclareTargetDeclAttr::ConvertDevTypeTyToStr(
|
||||
ActiveAttr.getValue()->getDevType());
|
||||
return;
|
||||
}
|
||||
Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
|
||||
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
|
||||
if (!Res || (!DeclareTargetNesting.empty() &&
|
||||
*AttrLoc == DeclareTargetNesting.back())) {
|
||||
auto *A = OMPDeclareTargetDeclAttr::CreateImplicit(
|
||||
Context, MT, DT, DeclareTargetNesting.size() + 1,
|
||||
SourceRange(Loc, Loc));
|
||||
ND->addAttr(A);
|
||||
if (ASTMutationListener *ML = Context.getASTMutationListener())
|
||||
ML->DeclarationMarkedOpenMPDeclareTarget(ND, A);
|
||||
checkDeclIsAllowedInOpenMPTarget(nullptr, ND, Loc);
|
||||
} else if (*Res != MT) {
|
||||
if (ActiveAttr.hasValue() && ActiveAttr.getValue()->getMapType() != MT &&
|
||||
ActiveAttr.getValue()->getLevel() == Level) {
|
||||
Diag(Loc, diag::err_omp_declare_target_to_and_link) << ND;
|
||||
return;
|
||||
}
|
||||
|
||||
if (ActiveAttr.hasValue() && ActiveAttr.getValue()->getLevel() == Level)
|
||||
return;
|
||||
|
||||
auto *A = OMPDeclareTargetDeclAttr::CreateImplicit(Context, MT, DT, Level,
|
||||
SourceRange(Loc, Loc));
|
||||
ND->addAttr(A);
|
||||
if (ASTMutationListener *ML = Context.getASTMutationListener())
|
||||
ML->DeclarationMarkedOpenMPDeclareTarget(ND, A);
|
||||
checkDeclIsAllowedInOpenMPTarget(nullptr, ND, Loc);
|
||||
}
|
||||
|
||||
static void checkDeclInTargetContext(SourceLocation SL, SourceRange SR,
|
||||
@ -20085,8 +20094,6 @@ static void checkDeclInTargetContext(SourceLocation SL, SourceRange SR,
|
||||
(SemaRef.getCurLambda(/*IgnoreNonLambdaCapturingScope=*/true) ||
|
||||
SemaRef.getCurBlock() || SemaRef.getCurCapturedRegion()) &&
|
||||
VD->hasGlobalStorage()) {
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> MapTy =
|
||||
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
|
||||
if (!MapTy || *MapTy != OMPDeclareTargetDeclAttr::MT_To) {
|
||||
// OpenMP 5.0, 2.12.7 declare target Directive, Restrictions
|
||||
// If a lambda declaration and definition appears between a
|
||||
@ -20150,15 +20157,19 @@ void Sema::checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D,
|
||||
if ((E || !VD->getType()->isIncompleteType()) &&
|
||||
!checkValueDeclInTarget(SL, SR, *this, DSAStack, VD))
|
||||
return;
|
||||
if (!E && !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
|
||||
if (!E && isInOpenMPDeclareTargetContext()) {
|
||||
// Checking declaration inside declare target region.
|
||||
if (isa<VarDecl>(D) || isa<FunctionDecl>(D) ||
|
||||
isa<FunctionTemplateDecl>(D)) {
|
||||
llvm::Optional<OMPDeclareTargetDeclAttr *> ActiveAttr =
|
||||
OMPDeclareTargetDeclAttr::getActiveAttr(VD);
|
||||
unsigned Level = DeclareTargetNesting.size();
|
||||
if (ActiveAttr.hasValue() && ActiveAttr.getValue()->getLevel() >= Level)
|
||||
return;
|
||||
DeclareTargetContextInfo &DTCI = DeclareTargetNesting.back();
|
||||
auto *A = OMPDeclareTargetDeclAttr::CreateImplicit(
|
||||
Context, OMPDeclareTargetDeclAttr::MT_To,
|
||||
OMPDeclareTargetDeclAttr::DT_Any, DeclareTargetNesting.size(),
|
||||
SourceRange(DeclareTargetNesting.back(),
|
||||
DeclareTargetNesting.back()));
|
||||
Context, OMPDeclareTargetDeclAttr::MT_To, DTCI.DT, Level,
|
||||
SourceRange(DTCI.Loc, DTCI.Loc));
|
||||
D->addAttr(A);
|
||||
if (ASTMutationListener *ML = Context.getASTMutationListener())
|
||||
ML->DeclarationMarkedOpenMPDeclareTarget(D, A);
|
||||
|
@ -11,10 +11,14 @@
|
||||
#include <complex.h>
|
||||
#endif
|
||||
|
||||
// CHECK: define weak {{.*}} @__muldc3
|
||||
// CHECK-DAG: call i32 @__nv_isnand(
|
||||
// CHECK-DAG: call i32 @__nv_isinfd(
|
||||
// CHECK-DAG: call double @__nv_copysign(
|
||||
// CHECK: define weak {{.*}} @__divsc3
|
||||
// CHECK-DAG: call i32 @__nv_isnanf(
|
||||
// CHECK-DAG: call i32 @__nv_isinff(
|
||||
// CHECK-DAG: call i32 @__nv_finitef(
|
||||
// CHECK-DAG: call float @__nv_copysignf(
|
||||
// CHECK-DAG: call float @__nv_scalbnf(
|
||||
// CHECK-DAG: call float @__nv_fabsf(
|
||||
// CHECK-DAG: call float @__nv_logbf(
|
||||
|
||||
// CHECK: define weak {{.*}} @__mulsc3
|
||||
// CHECK-DAG: call i32 @__nv_isnanf(
|
||||
@ -30,14 +34,10 @@
|
||||
// CHECK-DAG: call double @__nv_fabs(
|
||||
// CHECK-DAG: call double @__nv_logb(
|
||||
|
||||
// CHECK: define weak {{.*}} @__divsc3
|
||||
// CHECK-DAG: call i32 @__nv_isnanf(
|
||||
// CHECK-DAG: call i32 @__nv_isinff(
|
||||
// CHECK-DAG: call i32 @__nv_finitef(
|
||||
// CHECK-DAG: call float @__nv_copysignf(
|
||||
// CHECK-DAG: call float @__nv_scalbnf(
|
||||
// CHECK-DAG: call float @__nv_fabsf(
|
||||
// CHECK-DAG: call float @__nv_logbf(
|
||||
// CHECK: define weak {{.*}} @__muldc3
|
||||
// CHECK-DAG: call i32 @__nv_isnand(
|
||||
// CHECK-DAG: call i32 @__nv_isinfd(
|
||||
// CHECK-DAG: call double @__nv_copysign(
|
||||
|
||||
void test_scmplx(float _Complex a) {
|
||||
#pragma omp target
|
||||
|
@ -82,31 +82,38 @@ int maini1() {
|
||||
// CHECK1-SAME: () #[[ATTR2]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[A1:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i8 @__kmpc_is_spmd_exec_mode() #[[ATTR3:[0-9]+]]
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = icmp ne i8 [[TMP0]], 0
|
||||
// CHECK1-NEXT: br i1 [[TMP1]], label [[DOTSPMD:%.*]], label [[DOTNON_SPMD:%.*]]
|
||||
// CHECK1-NEXT: [[A2:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]])
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = call i16 @__kmpc_parallel_level(%struct.ident_t* @[[GLOB2]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = icmp eq i16 [[TMP1]], 0
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = call i8 @__kmpc_is_spmd_exec_mode() #[[ATTR3:[0-9]+]]
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = icmp ne i8 [[TMP3]], 0
|
||||
// CHECK1-NEXT: br i1 [[TMP4]], label [[DOTSPMD:%.*]], label [[DOTNON_SPMD:%.*]]
|
||||
// CHECK1: .spmd:
|
||||
// CHECK1-NEXT: br label [[DOTEXIT:%.*]]
|
||||
// CHECK1: .non-spmd:
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = call i8* @__kmpc_data_sharing_coalesced_push_stack(i64 128, i16 0)
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to %struct._globalized_locals_ty*
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = select i1 [[TMP2]], i64 4, i64 128
|
||||
// CHECK1-NEXT: [[TMP6:%.*]] = call i8* @__kmpc_data_sharing_coalesced_push_stack(i64 [[TMP5]], i16 0)
|
||||
// CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP6]] to %struct._globalized_locals_ty*
|
||||
// CHECK1-NEXT: br label [[DOTEXIT]]
|
||||
// CHECK1: .exit:
|
||||
// CHECK1-NEXT: [[_SELECT_STACK:%.*]] = phi %struct._globalized_locals_ty* [ null, [[DOTSPMD]] ], [ [[TMP3]], [[DOTNON_SPMD]] ]
|
||||
// CHECK1-NEXT: [[_SELECT_STACK:%.*]] = phi %struct._globalized_locals_ty* [ null, [[DOTSPMD]] ], [ [[TMP7]], [[DOTNON_SPMD]] ]
|
||||
// CHECK1-NEXT: [[TMP8:%.*]] = bitcast %struct._globalized_locals_ty* [[_SELECT_STACK]] to %struct._globalized_locals_ty.0*
|
||||
// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], %struct._globalized_locals_ty* [[_SELECT_STACK]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[NVPTX_TID:%.*]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
|
||||
// CHECK1-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[NVPTX_TID]], 31
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [32 x i32], [32 x i32]* [[A]], i32 0, i32 [[NVPTX_LANE_ID]]
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = select i1 [[TMP1]], i32* [[A1]], i32* [[TMP4]]
|
||||
// CHECK1-NEXT: [[CALL:%.*]] = call i32 @_Z3fooRi(i32* nonnull align 4 dereferenceable(4) [[TMP5]]) #[[ATTR4]]
|
||||
// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], [32 x i32]* [[A]], i32 0, i32 [[NVPTX_LANE_ID]]
|
||||
// CHECK1-NEXT: [[A1:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], %struct._globalized_locals_ty.0* [[TMP8]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP10:%.*]] = select i1 [[TMP2]], i32* [[A1]], i32* [[TMP9]]
|
||||
// CHECK1-NEXT: [[TMP11:%.*]] = select i1 [[TMP4]], i32* [[A2]], i32* [[TMP10]]
|
||||
// CHECK1-NEXT: [[CALL:%.*]] = call i32 @_Z3fooRi(i32* nonnull align 4 dereferenceable(4) [[TMP11]]) #[[ATTR4]]
|
||||
// CHECK1-NEXT: store i32 [[CALL]], i32* [[RETVAL]], align 4
|
||||
// CHECK1-NEXT: br i1 [[TMP1]], label [[DOTEXIT3:%.*]], label [[DOTNON_SPMD2:%.*]]
|
||||
// CHECK1: .non-spmd2:
|
||||
// CHECK1-NEXT: [[TMP6:%.*]] = bitcast %struct._globalized_locals_ty* [[_SELECT_STACK]] to i8*
|
||||
// CHECK1-NEXT: call void @__kmpc_data_sharing_pop_stack(i8* [[TMP6]])
|
||||
// CHECK1-NEXT: br label [[DOTEXIT3]]
|
||||
// CHECK1: .exit3:
|
||||
// CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[RETVAL]], align 4
|
||||
// CHECK1-NEXT: ret i32 [[TMP7]]
|
||||
// CHECK1-NEXT: br i1 [[TMP4]], label [[DOTEXIT4:%.*]], label [[DOTNON_SPMD3:%.*]]
|
||||
// CHECK1: .non-spmd3:
|
||||
// CHECK1-NEXT: [[TMP12:%.*]] = bitcast %struct._globalized_locals_ty* [[_SELECT_STACK]] to i8*
|
||||
// CHECK1-NEXT: call void @__kmpc_data_sharing_pop_stack(i8* [[TMP12]])
|
||||
// CHECK1-NEXT: br label [[DOTEXIT4]]
|
||||
// CHECK1: .exit4:
|
||||
// CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[RETVAL]], align 4
|
||||
// CHECK1-NEXT: ret i32 [[TMP13]]
|
||||
//
|
||||
|
@ -1,20 +0,0 @@
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-pc-linux-gnu -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-i386-host.bc
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-i386-host.bc -o - | FileCheck %s
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux-gnu -fopenmp-targets=x86_64-unknown-linux-gnu -emit-llvm-bc %s -o %t-x86_64-host.bc
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86_64-host.bc -o - | FileCheck %s
|
||||
|
||||
// expected-no-diagnostics
|
||||
|
||||
#pragma omp declare target
|
||||
#pragma omp begin declare variant match(device={kind(nohost)})
|
||||
int G1;
|
||||
#pragma omp end declare variant
|
||||
#pragma omp end declare target
|
||||
|
||||
// CHECK: @[[G:.+]] = hidden {{.*}}global i32 0, align 4
|
||||
// CHECK: !omp_offload.info = !{!0}
|
||||
// CHECK: !0 = !{i32 1, !"[[G]]", i32 0, i32 0}
|
@ -17,13 +17,16 @@ __thread int t; // expected-note {{defined as threadprivate or thread local}}
|
||||
void f();
|
||||
#pragma omp end declare target shared(a) // expected-warning {{extra tokens at the end of '#pragma omp end declare target' are ignored}}
|
||||
|
||||
#pragma omp declare target map(a) // omp45-error {{unexpected 'map' clause, only 'to' or 'link' clauses expected}} omp5-error {{unexpected 'map' clause, only 'to', 'link' or 'device_type' clauses expected}}
|
||||
#pragma omp declare target map(a) // expected-error {{expected at least one 'to' or 'link' clause}} omp45-error {{unexpected 'map' clause, only 'to' or 'link' clauses expected}} omp5-error {{unexpected 'map' clause, only 'to', 'link' or 'device_type' clauses expected}}
|
||||
|
||||
#pragma omp declare target to(foo1) // expected-error {{use of undeclared identifier 'foo1'}}
|
||||
|
||||
#pragma omp declare target link(foo2) // expected-error {{use of undeclared identifier 'foo2'}}
|
||||
|
||||
#pragma omp declare target to(f) device_type(any) device_type(any) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} omp5-warning 2 {{more than one 'device_type' clause is specified}} omp5-error {{'device_type(host)' does not match previously specified 'device_type(any)' for the same declaration}}
|
||||
#pragma omp declare target to(f) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} dev5-note {{marked as 'device_type(host)' here}}
|
||||
|
||||
void q();
|
||||
#pragma omp declare target to(q) device_type(any) device_type(any) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} omp5-warning {{more than one 'device_type' clause is specified}}
|
||||
|
||||
void c();
|
||||
|
||||
@ -118,7 +121,8 @@ void foo(int p) {
|
||||
g = object.method();
|
||||
g += object.method1();
|
||||
g += object1.method() + p;
|
||||
f();
|
||||
f(); // dev5-error {{function with 'device_type(host)' is not available on device}}
|
||||
q();
|
||||
c();
|
||||
}
|
||||
#pragma omp declare target
|
||||
@ -150,10 +154,10 @@ int main (int argc, char **argv) {
|
||||
}
|
||||
|
||||
namespace {
|
||||
#pragma omp declare target // expected-note {{to match this '#pragma omp declare target'}}
|
||||
#pragma omp declare target
|
||||
int x;
|
||||
} // expected-error {{expected '#pragma omp end declare target'}}
|
||||
#pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}}
|
||||
}
|
||||
#pragma omp end declare target
|
||||
|
||||
#pragma omp declare target link(S) // expected-error {{'S' used in declare target directive is not a variable or a function name}}
|
||||
|
||||
@ -187,4 +191,10 @@ void any6() {host1();}
|
||||
void any7() {device();} // host5-error {{function with 'device_type(nohost)' is not available on host}}
|
||||
void any8() {any2();}
|
||||
|
||||
#pragma omp declare target // expected-error {{expected '#pragma omp end declare target'}} expected-note {{to match this '#pragma omp declare target'}}
|
||||
int MultiDevTy;
|
||||
#pragma omp declare target to(MultiDevTy) device_type(any) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
|
||||
#pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} omp5-error {{'device_type(host)' does not match previously specified 'device_type(any)' for the same declaration}}
|
||||
#pragma omp declare target to(MultiDevTy) device_type(nohost) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} omp5-error {{'device_type(nohost)' does not match previously specified 'device_type(any)' for the same declaration}}
|
||||
|
||||
// TODO: Issue an error message error {{expected '#pragma omp end declare target'}} note {{to match this '#pragma omp declare target'}}
|
||||
#pragma omp declare target
|
||||
|
@ -0,0 +1,75 @@
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix HOST
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix DEVICE
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-pc-linux-gnu -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix HOST
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-pc-linux-gnu -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-i386-host.bc
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-i386-host.bc -o - | FileCheck %s --check-prefix DEVICE
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux-gnu -fopenmp-targets=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix HOST
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux-gnu -fopenmp-targets=x86_64-unknown-linux-gnu -emit-llvm-bc %s -o %t-x86_64-host.bc
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86_64-host.bc -o - | FileCheck %s --check-prefix DEVICE
|
||||
|
||||
// expected-no-diagnostics
|
||||
|
||||
#pragma omp declare target
|
||||
#pragma omp begin declare variant match(device = {kind(nohost)})
|
||||
int G1;
|
||||
static int G2;
|
||||
#pragma omp end declare variant
|
||||
#pragma omp end declare target
|
||||
|
||||
#pragma omp begin declare target device_type(nohost)
|
||||
int G3;
|
||||
static int G4;
|
||||
#pragma omp end declare target
|
||||
|
||||
#pragma omp declare target
|
||||
int G5;
|
||||
static int G6;
|
||||
#pragma omp end declare target
|
||||
|
||||
#pragma omp declare target to(G5, G6) device_type(nohost)
|
||||
|
||||
#pragma omp begin declare target device_type(host)
|
||||
int G7;
|
||||
static int G8;
|
||||
#pragma omp end declare target
|
||||
|
||||
#pragma omp declare target
|
||||
int G9;
|
||||
static int G10;
|
||||
#pragma omp end declare target
|
||||
|
||||
int G11;
|
||||
static int G12;
|
||||
#pragma omp declare target to(G9, G10, G11, G12) device_type(host)
|
||||
|
||||
// TODO: The code below should probably work but it is not 100% clear.
|
||||
#if 0
|
||||
#pragma omp declare target
|
||||
#pragma omp begin declare variant match(device = {kind(host)})
|
||||
int GX;
|
||||
static int GY;
|
||||
#pragma omp end declare variant
|
||||
#pragma omp end declare target
|
||||
#endif
|
||||
|
||||
// TODO: It is odd, probably wrong, that we don't mangle all variables.
|
||||
|
||||
// DEVICE-DAG: @G1 = hidden {{.*}}global i32 0, align 4
|
||||
// DEVICE-DAG: @_ZL2G2 = internal {{.*}}global i32 0, align 4
|
||||
// DEVICE-DAG: @G3 = hidden {{.*}}global i32 0, align 4
|
||||
// DEVICE-DAG: @_ZL2G4 = internal {{.*}}global i32 0, align 4
|
||||
// DEVICE-DAG: @G5 = hidden {{.*}}global i32 0, align 4
|
||||
// DEVICE-DAG: @_ZL2G6 = internal {{.*}}global i32 0, align 4
|
||||
// DEVICE-NOT: ref
|
||||
// DEVICE-NOT: llvm.used
|
||||
// DEVICE-NOT: omp_offload
|
||||
|
||||
// HOST-DAG: @G7 = dso_local global i32 0, align 4
|
||||
// HOST-DAG: @_ZL2G8 = internal global i32 0, align 4
|
||||
// HOST-DAG: @G9 = dso_local global i32 0, align 4
|
||||
// HOST-DAG: @_ZL3G10 = internal global i32 0, align 4
|
||||
// HOST-DAG: @G11 = dso_local global i32 0, align 4
|
||||
// HOST-DAG: @_ZL3G12 = internal global i32 0, align 4
|
@ -176,6 +176,28 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK1-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -214,6 +236,23 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK1-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -693,45 +732,6 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK1-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK1-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_for_firstprivate_codegen.cpp
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -769,6 +769,28 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK2-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -807,6 +829,23 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK2-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK2-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -1286,45 +1325,6 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK2-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK2-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK2-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_for_firstprivate_codegen.cpp
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -1362,6 +1362,28 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK3-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1400,6 +1422,23 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK3-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK3-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1511,45 +1550,6 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK3-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK3-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK3-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_for_firstprivate_codegen.cpp
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1587,6 +1587,28 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK4-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
@ -1625,6 +1647,23 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK4-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK4-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
@ -1801,45 +1840,6 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK4-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK4-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK4-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_for_firstprivate_codegen.cpp
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
|
@ -28,7 +28,7 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
|
||||
|
||||
#endif // HEADER
|
||||
// CHECK-LABEL: define {{[^@]+}}@workshareloop_iterator
|
||||
// CHECK-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]]) [[ATTR0:#.*]] {
|
||||
// CHECK-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -58,8 +58,8 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = sub i64 [[DOTCOUNT]], 1
|
||||
// CHECK-NEXT: store i64 [[TMP2]], i64* [[P_UPPERBOUND]], align 8
|
||||
// CHECK-NEXT: store i64 1, i64* [[P_STRIDE]], align 8
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1:@.*]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_init_8u(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[P_LASTITER]], i64* [[P_LOWERBOUND]], i64* [[P_UPPERBOUND]], i64* [[P_STRIDE]], i64 1, i64 1)
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_init_8u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[P_LASTITER]], i64* [[P_LOWERBOUND]], i64* [[P_UPPERBOUND]], i64* [[P_STRIDE]], i64 1, i64 1)
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, i64* [[P_LOWERBOUND]], align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = load i64, i64* [[P_UPPERBOUND]], align 8
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = sub i64 [[TMP4]], [[TMP3]]
|
||||
@ -97,16 +97,16 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
|
||||
// CHECK-NEXT: [[OMP_LOOP_NEXT]] = add nuw i64 [[OMP_LOOP_IV]], 1
|
||||
// CHECK-NEXT: br label [[OMP_LOOP_HEADER]]
|
||||
// CHECK: omp_loop.exit:
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2:@.*]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
|
||||
// CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]]
|
||||
// CHECK: omp_loop.after:
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@__captured_stmt
|
||||
// CHECK-SAME: (i64* nonnull align 8 dereferenceable(8) [[DISTANCE:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) [[ATTR2:#.*]] {
|
||||
// CHECK-SAME: (i64* nonnull align 8 dereferenceable(8) [[DISTANCE:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca i64*, align 8
|
||||
// CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
|
||||
@ -145,7 +145,7 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@__captured_stmt.1
|
||||
// CHECK-SAME: (%struct.MyIterator* nonnull align 1 dereferenceable(1) [[LOOPVAR:%.*]], i64 [[LOGICAL:%.*]], %struct.anon.0* noalias [[__CONTEXT:%.*]]) [[ATTR2]] {
|
||||
// CHECK-SAME: (%struct.MyIterator* nonnull align 1 dereferenceable(1) [[LOOPVAR:%.*]], i64 [[LOGICAL:%.*]], %struct.anon.0* noalias [[__CONTEXT:%.*]]) #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca %struct.MyIterator*, align 8
|
||||
// CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i64, align 8
|
||||
@ -159,7 +159,7 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* [[LOGICAL_ADDR]], align 8
|
||||
// CHECK-NEXT: [[MUL:%.*]] = mul i64 1, [[TMP2]]
|
||||
// CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[MUL]] to i32
|
||||
// CHECK-NEXT: call void @_ZNK10MyIteratorplEj(%struct.MyIterator* sret(%struct.MyIterator) align 1 [[REF_TMP]], %struct.MyIterator* nonnull dereferenceable(1) [[TMP1]], i32 [[CONV]])
|
||||
// CHECK-NEXT: call void @_ZNK10MyIteratorplEj(%struct.MyIterator* sret([[STRUCT_MYITERATOR]]) align 1 [[REF_TMP]], %struct.MyIterator* nonnull dereferenceable(1) [[TMP1]], i32 [[CONV]])
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load %struct.MyIterator*, %struct.MyIterator** [[LOOPVAR_ADDR]], align 8
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call nonnull align 1 dereferenceable(1) %struct.MyIterator* @_ZN10MyIteratoraSERKS_(%struct.MyIterator* nonnull dereferenceable(1) [[TMP3]], %struct.MyIterator* nonnull align 1 dereferenceable(1) [[REF_TMP]])
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -34,7 +34,7 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
|
||||
|
||||
#endif // HEADER
|
||||
// CHECK-LABEL: define {{[^@]+}}@workshareloop_rangefor
|
||||
// CHECK-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]]) [[ATTR0:#.*]] {
|
||||
// CHECK-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -57,9 +57,9 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
|
||||
// CHECK-NEXT: call void @_ZN7MyRangeC1Ei(%struct.MyRange* nonnull dereferenceable(1) [[REF_TMP]], i32 42)
|
||||
// CHECK-NEXT: store %struct.MyRange* [[REF_TMP]], %struct.MyRange** [[__RANGE2]], align 8
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load %struct.MyRange*, %struct.MyRange** [[__RANGE2]], align 8
|
||||
// CHECK-NEXT: call void @_ZN7MyRange5beginEv(%struct.MyIterator* sret(%struct.MyIterator) align 1 [[__BEGIN2]], %struct.MyRange* nonnull dereferenceable(1) [[TMP0]])
|
||||
// CHECK-NEXT: call void @_ZN7MyRange5beginEv(%struct.MyIterator* sret([[STRUCT_MYITERATOR]]) align 1 [[__BEGIN2]], %struct.MyRange* nonnull dereferenceable(1) [[TMP0]])
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = load %struct.MyRange*, %struct.MyRange** [[__RANGE2]], align 8
|
||||
// CHECK-NEXT: call void @_ZN7MyRange3endEv(%struct.MyIterator* sret(%struct.MyIterator) align 1 [[__END2]], %struct.MyRange* nonnull dereferenceable(1) [[TMP1]])
|
||||
// CHECK-NEXT: call void @_ZN7MyRange3endEv(%struct.MyIterator* sret([[STRUCT_MYITERATOR]]) align 1 [[__END2]], %struct.MyRange* nonnull dereferenceable(1) [[TMP1]])
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @_ZNK10MyIteratordeEv(%struct.MyIterator* nonnull dereferenceable(1) [[__BEGIN2]])
|
||||
// CHECK-NEXT: store i32 [[CALL]], i32* [[I]], align 4
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 0
|
||||
@ -76,8 +76,8 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = sub i64 [[DOTCOUNT]], 1
|
||||
// CHECK-NEXT: store i64 [[TMP5]], i64* [[P_UPPERBOUND]], align 8
|
||||
// CHECK-NEXT: store i64 1, i64* [[P_STRIDE]], align 8
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1:@.*]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_init_8u(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[P_LASTITER]], i64* [[P_LOWERBOUND]], i64* [[P_UPPERBOUND]], i64* [[P_STRIDE]], i64 1, i64 1)
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_init_8u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[P_LASTITER]], i64* [[P_LOWERBOUND]], i64* [[P_UPPERBOUND]], i64* [[P_STRIDE]], i64 1, i64 1)
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, i64* [[P_LOWERBOUND]], align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = load i64, i64* [[P_UPPERBOUND]], align 8
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = sub i64 [[TMP7]], [[TMP6]]
|
||||
@ -113,16 +113,16 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
|
||||
// CHECK-NEXT: [[OMP_LOOP_NEXT]] = add nuw i64 [[OMP_LOOP_IV]], 1
|
||||
// CHECK-NEXT: br label [[OMP_LOOP_HEADER]]
|
||||
// CHECK: omp_loop.exit:
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2:@.*]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
|
||||
// CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]]
|
||||
// CHECK: omp_loop.after:
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@__captured_stmt
|
||||
// CHECK-SAME: (i64* nonnull align 8 dereferenceable(8) [[DISTANCE:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) [[ATTR2:#.*]] {
|
||||
// CHECK-SAME: (i64* nonnull align 8 dereferenceable(8) [[DISTANCE:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca i64*, align 8
|
||||
// CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
|
||||
@ -163,7 +163,7 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@__captured_stmt.1
|
||||
// CHECK-SAME: (i32* nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i64 [[LOGICAL:%.*]], %struct.anon.0* noalias [[__CONTEXT:%.*]]) [[ATTR2]] {
|
||||
// CHECK-SAME: (i32* nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i64 [[LOGICAL:%.*]], %struct.anon.0* noalias [[__CONTEXT:%.*]]) #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i64, align 8
|
||||
@ -177,7 +177,7 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* [[LOGICAL_ADDR]], align 8
|
||||
// CHECK-NEXT: [[MUL:%.*]] = mul i64 1, [[TMP2]]
|
||||
// CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[MUL]] to i32
|
||||
// CHECK-NEXT: call void @_ZNK10MyIteratorplEj(%struct.MyIterator* sret(%struct.MyIterator) align 1 [[REF_TMP]], %struct.MyIterator* nonnull dereferenceable(1) [[TMP1]], i32 [[CONV]])
|
||||
// CHECK-NEXT: call void @_ZNK10MyIteratorplEj(%struct.MyIterator* sret([[STRUCT_MYITERATOR]]) align 1 [[REF_TMP]], %struct.MyIterator* nonnull dereferenceable(1) [[TMP1]], i32 [[CONV]])
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @_ZNK10MyIteratordeEv(%struct.MyIterator* nonnull dereferenceable(1) [[REF_TMP]])
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i32*, i32** [[LOOPVAR_ADDR]], align 8
|
||||
// CHECK-NEXT: store i32 [[CALL]], i32* [[TMP3]], align 4
|
||||
|
@ -14,7 +14,7 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
|
||||
|
||||
#endif // HEADER
|
||||
// CHECK-LABEL: define {{[^@]+}}@workshareloop_unsigned
|
||||
// CHECK-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) [[ATTR0:#.*]] {
|
||||
// CHECK-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -46,8 +46,8 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = sub i32 [[DOTCOUNT]], 1
|
||||
// CHECK-NEXT: store i32 [[TMP3]], i32* [[P_UPPERBOUND]], align 4
|
||||
// CHECK-NEXT: store i32 1, i32* [[P_STRIDE]], align 4
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1:@.*]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[P_LASTITER]], i32* [[P_LOWERBOUND]], i32* [[P_UPPERBOUND]], i32* [[P_STRIDE]], i32 1, i32 1)
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[P_LASTITER]], i32* [[P_LOWERBOUND]], i32* [[P_UPPERBOUND]], i32* [[P_STRIDE]], i32 1, i32 1)
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* [[P_LOWERBOUND]], align 4
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[P_UPPERBOUND]], align 4
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = sub i32 [[TMP5]], [[TMP4]]
|
||||
@ -89,16 +89,16 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
|
||||
// CHECK-NEXT: [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 1
|
||||
// CHECK-NEXT: br label [[OMP_LOOP_HEADER]]
|
||||
// CHECK: omp_loop.exit:
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM9:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2:@.*]], i32 [[OMP_GLOBAL_THREAD_NUM9]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM9:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM9]])
|
||||
// CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]]
|
||||
// CHECK: omp_loop.after:
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@__captured_stmt
|
||||
// CHECK-SAME: (i32* nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) [[ATTR1:#.*]] {
|
||||
// CHECK-SAME: (i32* nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
|
||||
@ -135,7 +135,7 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@__captured_stmt.1
|
||||
// CHECK-SAME: (i32* nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 [[LOGICAL:%.*]], %struct.anon.0* noalias [[__CONTEXT:%.*]]) [[ATTR1]] {
|
||||
// CHECK-SAME: (i32* nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 [[LOGICAL:%.*]], %struct.anon.0* noalias [[__CONTEXT:%.*]]) #[[ATTR1]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4
|
||||
|
@ -12,10 +12,10 @@
|
||||
|
||||
// ALL-LABEL: @_Z17nested_parallel_0v(
|
||||
// ALL-NEXT: entry:
|
||||
// ALL-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @1)
|
||||
// ALL-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// ALL-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// ALL: omp_parallel:
|
||||
// ALL-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @1, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @_Z17nested_parallel_0v..omp_par.1 to void (i32*, i32*, ...)*))
|
||||
// ALL-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @_Z17nested_parallel_0v..omp_par.1 to void (i32*, i32*, ...)*))
|
||||
// ALL-NEXT: br label [[OMP_PAR_OUTLINED_EXIT12:%.*]]
|
||||
// ALL: omp.par.outlined.exit12:
|
||||
// ALL-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
@ -39,10 +39,10 @@ void nested_parallel_0(void) {
|
||||
// ALL-NEXT: store float* [[R:%.*]], float** [[R_ADDR]], align 8
|
||||
// ALL-NEXT: store i32 [[A:%.*]], i32* [[A_ADDR]], align 4
|
||||
// ALL-NEXT: store double [[B:%.*]], double* [[B_ADDR]], align 8
|
||||
// ALL-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @1)
|
||||
// ALL-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// ALL-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// ALL: omp_parallel:
|
||||
// ALL-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @1, i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z17nested_parallel_1Pfid..omp_par.2 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]])
|
||||
// ALL-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z17nested_parallel_1Pfid..omp_par.2 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]])
|
||||
// ALL-NEXT: br label [[OMP_PAR_OUTLINED_EXIT13:%.*]]
|
||||
// ALL: omp.par.outlined.exit13:
|
||||
// ALL-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
@ -67,10 +67,10 @@ void nested_parallel_1(float *r, int a, double b) {
|
||||
// ALL-NEXT: store float* [[R:%.*]], float** [[R_ADDR]], align 8
|
||||
// ALL-NEXT: store i32 [[A:%.*]], i32* [[A_ADDR]], align 4
|
||||
// ALL-NEXT: store double [[B:%.*]], double* [[B_ADDR]], align 8
|
||||
// ALL-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @1)
|
||||
// ALL-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// ALL-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// ALL: omp_parallel:
|
||||
// ALL-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @1, i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z17nested_parallel_2Pfid..omp_par.5 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]])
|
||||
// ALL-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z17nested_parallel_2Pfid..omp_par.5 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]])
|
||||
// ALL-NEXT: br label [[OMP_PAR_OUTLINED_EXIT55:%.*]]
|
||||
// ALL: omp.par.outlined.exit55:
|
||||
// ALL-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
|
@ -11,10 +11,10 @@
|
||||
|
||||
// CHECK-LABEL: @_Z14parallel_for_0v(
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1:@.*]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// CHECK: omp_parallel:
|
||||
// CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @_Z14parallel_for_0v..omp_par to void (i32*, i32*, ...)*))
|
||||
// CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @_Z14parallel_for_0v..omp_par to void (i32*, i32*, ...)*))
|
||||
// CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
|
||||
// CHECK: omp.par.outlined.exit:
|
||||
// CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
@ -23,15 +23,15 @@
|
||||
//
|
||||
// CHECK-DEBUG-LABEL: @_Z14parallel_for_0v(
|
||||
// CHECK-DEBUG-NEXT: entry:
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1:@.*]]), [[DBG12:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]), !dbg [[DBG12:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// CHECK-DEBUG: omp_parallel:
|
||||
// CHECK-DEBUG-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @_Z14parallel_for_0v..omp_par to void (i32*, i32*, ...)*)), [[DBG13:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @_Z14parallel_for_0v..omp_par to void (i32*, i32*, ...)*)), !dbg [[DBG13:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
|
||||
// CHECK-DEBUG: omp.par.outlined.exit:
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
// CHECK-DEBUG: omp.par.exit.split:
|
||||
// CHECK-DEBUG-NEXT: ret void, [[DBG17:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: ret void, !dbg [[DBG17:![0-9]+]]
|
||||
//
|
||||
void parallel_for_0(void) {
|
||||
#pragma omp parallel
|
||||
@ -50,10 +50,10 @@ void parallel_for_0(void) {
|
||||
// CHECK-NEXT: store float* [[R:%.*]], float** [[R_ADDR]], align 8
|
||||
// CHECK-NEXT: store i32 [[A:%.*]], i32* [[A_ADDR]], align 4
|
||||
// CHECK-NEXT: store double [[B:%.*]], double* [[B_ADDR]], align 8
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// CHECK: omp_parallel:
|
||||
// CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z14parallel_for_1Pfid..omp_par.4 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]])
|
||||
// CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z14parallel_for_1Pfid..omp_par.4 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]])
|
||||
// CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT16:%.*]]
|
||||
// CHECK: omp.par.outlined.exit16:
|
||||
// CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
@ -66,20 +66,20 @@ void parallel_for_0(void) {
|
||||
// CHECK-DEBUG-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK-DEBUG-NEXT: [[B_ADDR:%.*]] = alloca double, align 8
|
||||
// CHECK-DEBUG-NEXT: store float* [[R:%.*]], float** [[R_ADDR]], align 8
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata float** [[R_ADDR]], [[META72:metadata !.*]], metadata !DIExpression()), [[DBG73:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata float** [[R_ADDR]], metadata [[META71:![0-9]+]], metadata !DIExpression()), !dbg [[DBG72:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: store i32 [[A:%.*]], i32* [[A_ADDR]], align 4
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata i32* [[A_ADDR]], [[META74:metadata !.*]], metadata !DIExpression()), [[DBG75:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata i32* [[A_ADDR]], metadata [[META73:![0-9]+]], metadata !DIExpression()), !dbg [[DBG74:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: store double [[B:%.*]], double* [[B_ADDR]], align 8
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata double* [[B_ADDR]], [[META76:metadata !.*]], metadata !DIExpression()), [[DBG77:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB6:@.*]]), [[DBG78:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata double* [[B_ADDR]], metadata [[META75:![0-9]+]], metadata !DIExpression()), !dbg [[DBG76:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB6:[0-9]+]]), !dbg [[DBG77:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// CHECK-DEBUG: omp_parallel:
|
||||
// CHECK-DEBUG-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB6]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z14parallel_for_1Pfid..omp_par.4 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]]), [[DBG79:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB6]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z14parallel_for_1Pfid..omp_par.4 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]]), !dbg [[DBG78:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PAR_OUTLINED_EXIT16:%.*]]
|
||||
// CHECK-DEBUG: omp.par.outlined.exit16:
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
// CHECK-DEBUG: omp.par.exit.split:
|
||||
// CHECK-DEBUG-NEXT: ret void, [[DBG81:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: ret void, !dbg [[DBG80:![0-9]+]]
|
||||
//
|
||||
void parallel_for_1(float *r, int a, double b) {
|
||||
#pragma omp parallel
|
||||
@ -110,10 +110,10 @@ void parallel_for_1(float *r, int a, double b) {
|
||||
// CHECK-NEXT: store float* [[R:%.*]], float** [[R_ADDR]], align 8
|
||||
// CHECK-NEXT: store i32 [[A:%.*]], i32* [[A_ADDR]], align 4
|
||||
// CHECK-NEXT: store double [[B:%.*]], double* [[B_ADDR]], align 8
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// CHECK: omp_parallel:
|
||||
// CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z14parallel_for_2Pfid..omp_par.23 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]])
|
||||
// CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z14parallel_for_2Pfid..omp_par.23 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]])
|
||||
// CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT184:%.*]]
|
||||
// CHECK: omp.par.outlined.exit184:
|
||||
// CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
@ -132,8 +132,8 @@ void parallel_for_1(float *r, int a, double b) {
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = sub i32 [[DOTCOUNT189]], 1
|
||||
// CHECK-NEXT: store i32 [[TMP3]], i32* [[P_UPPERBOUND205]], align 4
|
||||
// CHECK-NEXT: store i32 1, i32* [[P_STRIDE206]], align 4
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM207:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM207]], i32 34, i32* [[P_LASTITER203]], i32* [[P_LOWERBOUND204]], i32* [[P_UPPERBOUND205]], i32* [[P_STRIDE206]], i32 1, i32 1)
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM207:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM207]], i32 34, i32* [[P_LASTITER203]], i32* [[P_LOWERBOUND204]], i32* [[P_UPPERBOUND205]], i32* [[P_STRIDE206]], i32 1, i32 1)
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* [[P_LOWERBOUND204]], align 4
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[P_UPPERBOUND205]], align 4
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = sub i32 [[TMP5]], [[TMP4]]
|
||||
@ -160,9 +160,9 @@ void parallel_for_1(float *r, int a, double b) {
|
||||
// CHECK-NEXT: [[OMP_LOOP_NEXT199]] = add nuw i32 [[OMP_LOOP_IV197]], 1
|
||||
// CHECK-NEXT: br label [[OMP_LOOP_HEADER191]]
|
||||
// CHECK: omp_loop.exit195:
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM207]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM208:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2:@.*]], i32 [[OMP_GLOBAL_THREAD_NUM208]])
|
||||
// CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM207]])
|
||||
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM208:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM208]])
|
||||
// CHECK-NEXT: br label [[OMP_LOOP_AFTER196:%.*]]
|
||||
// CHECK: omp_loop.after196:
|
||||
// CHECK-NEXT: ret void
|
||||
@ -181,68 +181,68 @@ void parallel_for_1(float *r, int a, double b) {
|
||||
// CHECK-DEBUG-NEXT: [[P_UPPERBOUND205:%.*]] = alloca i32, align 4
|
||||
// CHECK-DEBUG-NEXT: [[P_STRIDE206:%.*]] = alloca i32, align 4
|
||||
// CHECK-DEBUG-NEXT: store float* [[R:%.*]], float** [[R_ADDR]], align 8
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata float** [[R_ADDR]], [[META133:metadata !.*]], metadata !DIExpression()), [[DBG134:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata float** [[R_ADDR]], metadata [[META132:![0-9]+]], metadata !DIExpression()), !dbg [[DBG133:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: store i32 [[A:%.*]], i32* [[A_ADDR]], align 4
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata i32* [[A_ADDR]], [[META135:metadata !.*]], metadata !DIExpression()), [[DBG136:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata i32* [[A_ADDR]], metadata [[META134:![0-9]+]], metadata !DIExpression()), !dbg [[DBG135:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: store double [[B:%.*]], double* [[B_ADDR]], align 8
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata double* [[B_ADDR]], [[META137:metadata !.*]], metadata !DIExpression()), [[DBG138:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB13:@.*]]), [[DBG139:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata double* [[B_ADDR]], metadata [[META136:![0-9]+]], metadata !DIExpression()), !dbg [[DBG137:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB13:[0-9]+]]), !dbg [[DBG138:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]]
|
||||
// CHECK-DEBUG: omp_parallel:
|
||||
// CHECK-DEBUG-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB13]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z14parallel_for_2Pfid..omp_par.23 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]]), [[DBG140:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB13]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double*, float**)* @_Z14parallel_for_2Pfid..omp_par.23 to void (i32*, i32*, ...)*), i32* [[A_ADDR]], double* [[B_ADDR]], float** [[R_ADDR]]), !dbg [[DBG139:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PAR_OUTLINED_EXIT184:%.*]]
|
||||
// CHECK-DEBUG: omp.par.outlined.exit184:
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
|
||||
// CHECK-DEBUG: omp.par.exit.split:
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata i32* [[I185]], [[META144:metadata !.*]], metadata !DIExpression()), [[DBG147:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: store i32 0, i32* [[I185]], align 4, [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON_17]], %struct.anon.17* [[AGG_CAPTURED186]], i32 0, i32 0, [[DBG148:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: store i32* [[I185]], i32** [[TMP0]], align 8, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON_18]], %struct.anon.18* [[AGG_CAPTURED187]], i32 0, i32 0, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, i32* [[I185]], align 4, [[DBG149:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: store i32 [[TMP2]], i32* [[TMP1]], align 4, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: call void @__captured_stmt.19(i32* [[DOTCOUNT_ADDR188]], %struct.anon.17* [[AGG_CAPTURED186]]), [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[DOTCOUNT189:%.*]] = load i32, i32* [[DOTCOUNT_ADDR188]], align 4, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER190:%.*]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: call void @llvm.dbg.declare(metadata i32* [[I185]], metadata [[META143:![0-9]+]], metadata !DIExpression()), !dbg [[DBG146:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: store i32 0, i32* [[I185]], align 4, !dbg [[DBG146]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON_17]], %struct.anon.17* [[AGG_CAPTURED186]], i32 0, i32 0, !dbg [[DBG147:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: store i32* [[I185]], i32** [[TMP0]], align 8, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON_18]], %struct.anon.18* [[AGG_CAPTURED187]], i32 0, i32 0, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, i32* [[I185]], align 4, !dbg [[DBG148:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: store i32 [[TMP2]], i32* [[TMP1]], align 4, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: call void @__captured_stmt.19(i32* [[DOTCOUNT_ADDR188]], %struct.anon.17* [[AGG_CAPTURED186]]), !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[DOTCOUNT189:%.*]] = load i32, i32* [[DOTCOUNT_ADDR188]], align 4, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER190:%.*]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG: omp_loop.preheader190:
|
||||
// CHECK-DEBUG-NEXT: store i32 0, i32* [[P_LOWERBOUND204]], align 4, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP3:%.*]] = sub i32 [[DOTCOUNT189]], 1, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: store i32 [[TMP3]], i32* [[P_UPPERBOUND205]], align 4, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: store i32 1, i32* [[P_STRIDE206]], align 4, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM207:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB42:@.*]]), [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* [[GLOB42]], i32 [[OMP_GLOBAL_THREAD_NUM207]], i32 34, i32* [[P_LASTITER203]], i32* [[P_LOWERBOUND204]], i32* [[P_UPPERBOUND205]], i32* [[P_STRIDE206]], i32 1, i32 1), [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, i32* [[P_LOWERBOUND204]], align 4, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, i32* [[P_UPPERBOUND205]], align 4, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP6:%.*]] = sub i32 [[TMP5]], [[TMP4]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP7:%.*]] = add i32 [[TMP6]], 1, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER191:%.*]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: store i32 0, i32* [[P_LOWERBOUND204]], align 4, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP3:%.*]] = sub i32 [[DOTCOUNT189]], 1, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: store i32 [[TMP3]], i32* [[P_UPPERBOUND205]], align 4, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: store i32 1, i32* [[P_STRIDE206]], align 4, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM207:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB42:[0-9]+]]), !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB42]], i32 [[OMP_GLOBAL_THREAD_NUM207]], i32 34, i32* [[P_LASTITER203]], i32* [[P_LOWERBOUND204]], i32* [[P_UPPERBOUND205]], i32* [[P_STRIDE206]], i32 1, i32 1), !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, i32* [[P_LOWERBOUND204]], align 4, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, i32* [[P_UPPERBOUND205]], align 4, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP6:%.*]] = sub i32 [[TMP5]], [[TMP4]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP7:%.*]] = add i32 [[TMP6]], 1, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER191:%.*]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG: omp_loop.header191:
|
||||
// CHECK-DEBUG-NEXT: [[OMP_LOOP_IV197:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER190]] ], [ [[OMP_LOOP_NEXT199:%.*]], [[OMP_LOOP_INC194:%.*]] ], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND192:%.*]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_LOOP_IV197:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER190]] ], [ [[OMP_LOOP_NEXT199:%.*]], [[OMP_LOOP_INC194:%.*]] ], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND192:%.*]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG: omp_loop.cond192:
|
||||
// CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP198:%.*]] = icmp ult i32 [[OMP_LOOP_IV197]], [[TMP7]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP198]], label [[OMP_LOOP_BODY193:%.*]], label [[OMP_LOOP_EXIT195:%.*]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP198:%.*]] = icmp ult i32 [[OMP_LOOP_IV197]], [[TMP7]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP198]], label [[OMP_LOOP_BODY193:%.*]], label [[OMP_LOOP_EXIT195:%.*]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG: omp_loop.body193:
|
||||
// CHECK-DEBUG-NEXT: [[TMP8:%.*]] = add i32 [[OMP_LOOP_IV197]], [[TMP4]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: call void @__captured_stmt.20(i32* [[I185]], i32 [[TMP8]], %struct.anon.18* [[AGG_CAPTURED187]]), [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, i32* [[A_ADDR]], align 4, [[DBG150:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: [[CONV200:%.*]] = sitofp i32 [[TMP9]] to double, [[DBG150]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load double, double* [[B_ADDR]], align 8, [[DBG151:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: [[ADD201:%.*]] = fadd double [[CONV200]], [[TMP10]], [[DBG152:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: [[CONV202:%.*]] = fptrunc double [[ADD201]] to float, [[DBG150]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP11:%.*]] = load float*, float** [[R_ADDR]], align 8, [[DBG153:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: store float [[CONV202]], float* [[TMP11]], align 4, [[DBG154:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC194]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP8:%.*]] = add i32 [[OMP_LOOP_IV197]], [[TMP4]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: call void @__captured_stmt.20(i32* [[I185]], i32 [[TMP8]], %struct.anon.18* [[AGG_CAPTURED187]]), !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, i32* [[A_ADDR]], align 4, !dbg [[DBG149:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: [[CONV200:%.*]] = sitofp i32 [[TMP9]] to double, !dbg [[DBG149]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load double, double* [[B_ADDR]], align 8, !dbg [[DBG150:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: [[ADD201:%.*]] = fadd double [[CONV200]], [[TMP10]], !dbg [[DBG151:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: [[CONV202:%.*]] = fptrunc double [[ADD201]] to float, !dbg [[DBG149]]
|
||||
// CHECK-DEBUG-NEXT: [[TMP11:%.*]] = load float*, float** [[R_ADDR]], align 8, !dbg [[DBG152:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: store float [[CONV202]], float* [[TMP11]], align 4, !dbg [[DBG153:![0-9]+]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC194]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG: omp_loop.inc194:
|
||||
// CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT199]] = add nuw i32 [[OMP_LOOP_IV197]], 1, [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER191]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT199]] = add nuw i32 [[OMP_LOOP_IV197]], 1, !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER191]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG: omp_loop.exit195:
|
||||
// CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* [[GLOB42]], i32 [[OMP_GLOBAL_THREAD_NUM207]]), [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM208:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB42]]), [[DBG151]]
|
||||
// CHECK-DEBUG-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB43:@.*]], i32 [[OMP_GLOBAL_THREAD_NUM208]]), [[DBG151]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER196:%.*]], [[DBG148]]
|
||||
// CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB42]], i32 [[OMP_GLOBAL_THREAD_NUM207]]), !dbg [[DBG147]]
|
||||
// CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM208:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB42]]), !dbg [[DBG150]]
|
||||
// CHECK-DEBUG-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB43:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM208]]), !dbg [[DBG150]]
|
||||
// CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER196:%.*]], !dbg [[DBG147]]
|
||||
// CHECK-DEBUG: omp_loop.after196:
|
||||
// CHECK-DEBUG-NEXT: ret void, [[DBG155:!dbg !.*]]
|
||||
// CHECK-DEBUG-NEXT: ret void, !dbg [[DBG154:![0-9]+]]
|
||||
//
|
||||
void parallel_for_2(float *r, int a, double b) {
|
||||
#pragma omp parallel
|
||||
|
@ -91,9 +91,9 @@ int maini1() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// DEVICE: define weak{{.*}} void @__omp_offloading_{{.*}}_{{.*}}maini1{{.*}}_l[[@LINE-7]](i32* nonnull align {{[0-9]+}} dereferenceable{{[^,]*}}
|
||||
// DEVICE: [[C:%.+]] = load i32, i32* [[C_ADDR]],
|
||||
// DEVICE: store i32 [[C]], i32* %
|
||||
// DEVICE-DAG: define weak{{.*}} void @__omp_offloading_{{.*}}_{{.*}}maini1{{.*}}_l[[@LINE-7]](i32* nonnull align {{[0-9]+}} dereferenceable{{[^,]*}}
|
||||
// DEVICE-DAG: [[C:%.+]] = load i32, i32* [[C_ADDR]],
|
||||
// DEVICE-DAG: store i32 [[C]], i32* %
|
||||
|
||||
// HOST: define internal void @__omp_offloading_{{.*}}_{{.*}}maini1{{.*}}_l[[@LINE-11]](i32* nonnull align {{[0-9]+}} dereferenceable{{.*}})
|
||||
// HOST: [[C:%.*]] = load i32, i32* @[[C_ADDR]],
|
||||
|
@ -6,8 +6,8 @@
|
||||
|
||||
// CHECK-DAG: @_Z3barv
|
||||
// CHECK-DAG: @_Z3bazv
|
||||
// CHECK-DAG: @"_Z53bar$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv"
|
||||
// CHECK-DAG: @"_Z53baz$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv"
|
||||
// CHECK-DAG: define{{.*}} @"_Z53bar$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv"
|
||||
// CHECK-DAG: define{{.*}} @"_Z53baz$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv"
|
||||
// CHECK-DAG: call i32 @"_Z53bar$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv"()
|
||||
// CHECK-DAG: call i32 @"_Z53baz$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv"()
|
||||
|
||||
|
@ -60,25 +60,14 @@ int main() {
|
||||
// CHECK1-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]])
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* null, i8** [[TMP1]], i64 0)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: call void @_Z4workv() #[[ATTR7]]
|
||||
// CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP1]], i64 0)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker
|
||||
// CHECK1-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK1-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[WORK_FN:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: [[EXEC_STATUS:%.*]] = alloca i8, align 1
|
||||
@ -122,7 +111,7 @@ int main() {
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = icmp ult i32 [[NVPTX_TID]], [[THREAD_LIMIT]]
|
||||
// CHECK1-NEXT: br i1 [[TMP0]], label [[DOTWORKER:%.*]], label [[DOTMASTERCHECK:%.*]]
|
||||
// CHECK1: .worker:
|
||||
// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker() #[[ATTR4:[0-9]+]]
|
||||
// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker() #[[ATTR3:[0-9]+]]
|
||||
// CHECK1-NEXT: br label [[DOTEXIT:%.*]]
|
||||
// CHECK1: .mastercheck:
|
||||
// CHECK1-NEXT: [[NVPTX_TID1:%.*]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
|
||||
@ -150,6 +139,32 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: call void @_Z4workv() #[[ATTR7]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 8
|
||||
// CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK1-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK1-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR3]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l21
|
||||
// CHECK2-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -185,25 +200,14 @@ int main() {
|
||||
// CHECK2-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 4
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]])
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK2-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* null, i8** [[TMP1]], i32 0)
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: call void @_Z4workv() #[[ATTR7]]
|
||||
// CHECK2-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP1]], i32 0)
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker
|
||||
// CHECK2-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK2-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[WORK_FN:%.*]] = alloca i8*, align 4
|
||||
// CHECK2-NEXT: [[EXEC_STATUS:%.*]] = alloca i8, align 1
|
||||
@ -247,7 +251,7 @@ int main() {
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = icmp ult i32 [[NVPTX_TID]], [[THREAD_LIMIT]]
|
||||
// CHECK2-NEXT: br i1 [[TMP0]], label [[DOTWORKER:%.*]], label [[DOTMASTERCHECK:%.*]]
|
||||
// CHECK2: .worker:
|
||||
// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker() #[[ATTR4:[0-9]+]]
|
||||
// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker() #[[ATTR3:[0-9]+]]
|
||||
// CHECK2-NEXT: br label [[DOTEXIT:%.*]]
|
||||
// CHECK2: .mastercheck:
|
||||
// CHECK2-NEXT: [[NVPTX_TID1:%.*]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
|
||||
@ -275,6 +279,32 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: call void @_Z4workv() #[[ATTR7]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK2-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK2-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK2-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK2-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK2-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR3]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l21
|
||||
// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -310,25 +340,14 @@ int main() {
|
||||
// CHECK3-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 4
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]])
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK3-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* null, i8** [[TMP1]], i32 0)
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: call void @_Z4workv() #[[ATTR7]]
|
||||
// CHECK3-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP1]], i32 0)
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker
|
||||
// CHECK3-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK3-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[WORK_FN:%.*]] = alloca i8*, align 4
|
||||
// CHECK3-NEXT: [[EXEC_STATUS:%.*]] = alloca i8, align 1
|
||||
@ -372,7 +391,7 @@ int main() {
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = icmp ult i32 [[NVPTX_TID]], [[THREAD_LIMIT]]
|
||||
// CHECK3-NEXT: br i1 [[TMP0]], label [[DOTWORKER:%.*]], label [[DOTMASTERCHECK:%.*]]
|
||||
// CHECK3: .worker:
|
||||
// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker() #[[ATTR4:[0-9]+]]
|
||||
// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23_worker() #[[ATTR3:[0-9]+]]
|
||||
// CHECK3-NEXT: br label [[DOTEXIT:%.*]]
|
||||
// CHECK3: .mastercheck:
|
||||
// CHECK3-NEXT: [[NVPTX_TID1:%.*]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
|
||||
@ -399,3 +418,29 @@ int main() {
|
||||
// CHECK3: .exit:
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: call void @_Z4workv() #[[ATTR7]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK3-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK3-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK3-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK3-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK3-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR3]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
|
@ -59,18 +59,11 @@ int main() {
|
||||
// CHECK1-NEXT: [[WORK_MATCH:%.*]] = icmp eq i8* [[TMP5]], bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*)
|
||||
// CHECK1-NEXT: br i1 [[WORK_MATCH]], label [[DOTEXECUTE_FN:%.*]], label [[DOTCHECK_NEXT:%.*]]
|
||||
// CHECK1: .execute.fn:
|
||||
// CHECK1-NEXT: call void @__omp_outlined___wrapper(i16 0, i32 [[TMP4]]) #[[ATTR5:[0-9]+]]
|
||||
// CHECK1-NEXT: call void @__omp_outlined___wrapper(i16 0, i32 [[TMP4]]) #[[ATTR4:[0-9]+]]
|
||||
// CHECK1-NEXT: br label [[DOTTERMINATE_PARALLEL:%.*]]
|
||||
// CHECK1: .check.next:
|
||||
// CHECK1-NEXT: [[TMP6:%.*]] = load i8*, i8** [[WORK_FN]], align 8
|
||||
// CHECK1-NEXT: [[WORK_MATCH1:%.*]] = icmp eq i8* [[TMP6]], bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*)
|
||||
// CHECK1-NEXT: br i1 [[WORK_MATCH1]], label [[DOTEXECUTE_FN2:%.*]], label [[DOTCHECK_NEXT3:%.*]]
|
||||
// CHECK1: .execute.fn2:
|
||||
// CHECK1-NEXT: call void @__omp_outlined__1_wrapper(i16 0, i32 [[TMP4]]) #[[ATTR5]]
|
||||
// CHECK1-NEXT: br label [[DOTTERMINATE_PARALLEL]]
|
||||
// CHECK1: .check.next3:
|
||||
// CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP2]] to void (i16, i32)*
|
||||
// CHECK1-NEXT: call void [[TMP7]](i16 0, i32 [[TMP4]])
|
||||
// CHECK1-NEXT: [[TMP6:%.*]] = bitcast i8* [[TMP2]] to void (i16, i32)*
|
||||
// CHECK1-NEXT: call void [[TMP6]](i16 0, i32 [[TMP4]])
|
||||
// CHECK1-NEXT: br label [[DOTTERMINATE_PARALLEL]]
|
||||
// CHECK1: .terminate.parallel:
|
||||
// CHECK1-NEXT: call void @__kmpc_kernel_end_parallel()
|
||||
@ -96,7 +89,7 @@ int main() {
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = icmp ult i32 [[NVPTX_TID]], [[THREAD_LIMIT]]
|
||||
// CHECK1-NEXT: br i1 [[TMP1]], label [[DOTWORKER:%.*]], label [[DOTMASTERCHECK:%.*]]
|
||||
// CHECK1: .worker:
|
||||
// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l25_worker() #[[ATTR5]]
|
||||
// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l25_worker() #[[ATTR4]]
|
||||
// CHECK1-NEXT: br label [[DOTEXIT:%.*]]
|
||||
// CHECK1: .mastercheck:
|
||||
// CHECK1-NEXT: [[NVPTX_TID1:%.*]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
|
||||
@ -121,7 +114,7 @@ int main() {
|
||||
// CHECK1-NEXT: [[TMP8:%.*]] = bitcast i32* [[TMP0]] to i8*
|
||||
// CHECK1-NEXT: store i8* [[TMP8]], i8** [[TMP7]], align 8
|
||||
// CHECK1-NEXT: [[TMP9:%.*]] = bitcast [1 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP9]], i64 1)
|
||||
// CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32*)* @__omp_outlined__ to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*), i8** [[TMP9]], i64 1)
|
||||
// CHECK1-NEXT: br label [[DOTTERMINATION_NOTIFIER:%.*]]
|
||||
// CHECK1: .termination.notifier:
|
||||
// CHECK1-NEXT: call void @__kmpc_kernel_deinit(i16 1)
|
||||
@ -136,18 +129,51 @@ int main() {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [1 x i8*], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]])
|
||||
// CHECK1-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 8
|
||||
// CHECK1-NEXT: call void @__kmpc_push_num_threads(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2)
|
||||
// CHECK1-NEXT: call void @__kmpc_push_num_threads(%struct.ident_t* @[[GLOB2]], i32 [[TMP0]], i32 2)
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[CAPTURED_VARS_ADDRS]], i64 0, i64 0
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = bitcast i32** [[C_ADDR]] to i8*
|
||||
// CHECK1-NEXT: store i8* [[TMP2]], i8** [[TMP1]], align 8
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = bitcast [1 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32**)* @__omp_outlined__ to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*), i8** [[TMP3]], i64 1)
|
||||
// CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB2]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32**)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP3]], i64 1)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[C_ADDR]], align 8
|
||||
// CHECK1-NEXT: call void @_Z3usePi(i32* [[TMP0]]) #[[ATTR7]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined___wrapper
|
||||
// CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 8
|
||||
// CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK1-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 8
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 0
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 8
|
||||
// CHECK1-NEXT: call void @__omp_outlined__(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]]) #[[ATTR4]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32** nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -187,7 +213,7 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined___wrapper
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
@ -202,40 +228,7 @@ int main() {
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 0
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32***
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = load i32**, i32*** [[TMP4]], align 8
|
||||
// CHECK1-NEXT: call void @__omp_outlined__(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32** [[TMP5]]) #[[ATTR5]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[C_ADDR]], align 8
|
||||
// CHECK1-NEXT: call void @_Z3usePi(i32* [[TMP0]]) #[[ATTR7]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 8
|
||||
// CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK1-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 8
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 0
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 8
|
||||
// CHECK1-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]]) #[[ATTR5]]
|
||||
// CHECK1-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32** [[TMP5]]) #[[ATTR4]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
@ -265,18 +258,11 @@ int main() {
|
||||
// CHECK2-NEXT: [[WORK_MATCH:%.*]] = icmp eq i8* [[TMP5]], bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*)
|
||||
// CHECK2-NEXT: br i1 [[WORK_MATCH]], label [[DOTEXECUTE_FN:%.*]], label [[DOTCHECK_NEXT:%.*]]
|
||||
// CHECK2: .execute.fn:
|
||||
// CHECK2-NEXT: call void @__omp_outlined___wrapper(i16 0, i32 [[TMP4]]) #[[ATTR5:[0-9]+]]
|
||||
// CHECK2-NEXT: call void @__omp_outlined___wrapper(i16 0, i32 [[TMP4]]) #[[ATTR4:[0-9]+]]
|
||||
// CHECK2-NEXT: br label [[DOTTERMINATE_PARALLEL:%.*]]
|
||||
// CHECK2: .check.next:
|
||||
// CHECK2-NEXT: [[TMP6:%.*]] = load i8*, i8** [[WORK_FN]], align 4
|
||||
// CHECK2-NEXT: [[WORK_MATCH1:%.*]] = icmp eq i8* [[TMP6]], bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*)
|
||||
// CHECK2-NEXT: br i1 [[WORK_MATCH1]], label [[DOTEXECUTE_FN2:%.*]], label [[DOTCHECK_NEXT3:%.*]]
|
||||
// CHECK2: .execute.fn2:
|
||||
// CHECK2-NEXT: call void @__omp_outlined__1_wrapper(i16 0, i32 [[TMP4]]) #[[ATTR5]]
|
||||
// CHECK2-NEXT: br label [[DOTTERMINATE_PARALLEL]]
|
||||
// CHECK2: .check.next3:
|
||||
// CHECK2-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP2]] to void (i16, i32)*
|
||||
// CHECK2-NEXT: call void [[TMP7]](i16 0, i32 [[TMP4]])
|
||||
// CHECK2-NEXT: [[TMP6:%.*]] = bitcast i8* [[TMP2]] to void (i16, i32)*
|
||||
// CHECK2-NEXT: call void [[TMP6]](i16 0, i32 [[TMP4]])
|
||||
// CHECK2-NEXT: br label [[DOTTERMINATE_PARALLEL]]
|
||||
// CHECK2: .terminate.parallel:
|
||||
// CHECK2-NEXT: call void @__kmpc_kernel_end_parallel()
|
||||
@ -302,7 +288,7 @@ int main() {
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = icmp ult i32 [[NVPTX_TID]], [[THREAD_LIMIT]]
|
||||
// CHECK2-NEXT: br i1 [[TMP1]], label [[DOTWORKER:%.*]], label [[DOTMASTERCHECK:%.*]]
|
||||
// CHECK2: .worker:
|
||||
// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l25_worker() #[[ATTR5]]
|
||||
// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l25_worker() #[[ATTR4]]
|
||||
// CHECK2-NEXT: br label [[DOTEXIT:%.*]]
|
||||
// CHECK2: .mastercheck:
|
||||
// CHECK2-NEXT: [[NVPTX_TID1:%.*]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
|
||||
@ -327,7 +313,7 @@ int main() {
|
||||
// CHECK2-NEXT: [[TMP8:%.*]] = bitcast i32* [[TMP0]] to i8*
|
||||
// CHECK2-NEXT: store i8* [[TMP8]], i8** [[TMP7]], align 4
|
||||
// CHECK2-NEXT: [[TMP9:%.*]] = bitcast [1 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK2-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP9]], i32 1)
|
||||
// CHECK2-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32*)* @__omp_outlined__ to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*), i8** [[TMP9]], i32 1)
|
||||
// CHECK2-NEXT: br label [[DOTTERMINATION_NOTIFIER:%.*]]
|
||||
// CHECK2: .termination.notifier:
|
||||
// CHECK2-NEXT: call void @__kmpc_kernel_deinit(i16 1)
|
||||
@ -342,18 +328,51 @@ int main() {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [1 x i8*], align 4
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]])
|
||||
// CHECK2-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_push_num_threads(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2)
|
||||
// CHECK2-NEXT: call void @__kmpc_push_num_threads(%struct.ident_t* @[[GLOB2]], i32 [[TMP0]], i32 2)
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[CAPTURED_VARS_ADDRS]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = bitcast i32** [[C_ADDR]] to i8*
|
||||
// CHECK2-NEXT: store i8* [[TMP2]], i8** [[TMP1]], align 4
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = bitcast [1 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK2-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32**)* @__omp_outlined__ to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*), i8** [[TMP3]], i32 1)
|
||||
// CHECK2-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB2]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32**)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP3]], i32 1)
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: call void @_Z3usePi(i32* [[TMP0]]) #[[ATTR7]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined___wrapper
|
||||
// CHECK2-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK2-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK2-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK2-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 4
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK2-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK2-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 4
|
||||
// CHECK2-NEXT: call void @__omp_outlined__(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]]) #[[ATTR4]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32** nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
@ -393,7 +412,7 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined___wrapper
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK2-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
@ -408,40 +427,7 @@ int main() {
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK2-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32***
|
||||
// CHECK2-NEXT: [[TMP5:%.*]] = load i32**, i32*** [[TMP4]], align 4
|
||||
// CHECK2-NEXT: call void @__omp_outlined__(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32** [[TMP5]]) #[[ATTR5]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: call void @_Z3usePi(i32* [[TMP0]]) #[[ATTR7]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK2-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK2-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK2-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK2-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 4
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK2-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK2-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 4
|
||||
// CHECK2-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]]) #[[ATTR5]]
|
||||
// CHECK2-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32** [[TMP5]]) #[[ATTR4]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
@ -471,18 +457,11 @@ int main() {
|
||||
// CHECK3-NEXT: [[WORK_MATCH:%.*]] = icmp eq i8* [[TMP5]], bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*)
|
||||
// CHECK3-NEXT: br i1 [[WORK_MATCH]], label [[DOTEXECUTE_FN:%.*]], label [[DOTCHECK_NEXT:%.*]]
|
||||
// CHECK3: .execute.fn:
|
||||
// CHECK3-NEXT: call void @__omp_outlined___wrapper(i16 0, i32 [[TMP4]]) #[[ATTR5:[0-9]+]]
|
||||
// CHECK3-NEXT: call void @__omp_outlined___wrapper(i16 0, i32 [[TMP4]]) #[[ATTR4:[0-9]+]]
|
||||
// CHECK3-NEXT: br label [[DOTTERMINATE_PARALLEL:%.*]]
|
||||
// CHECK3: .check.next:
|
||||
// CHECK3-NEXT: [[TMP6:%.*]] = load i8*, i8** [[WORK_FN]], align 4
|
||||
// CHECK3-NEXT: [[WORK_MATCH1:%.*]] = icmp eq i8* [[TMP6]], bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*)
|
||||
// CHECK3-NEXT: br i1 [[WORK_MATCH1]], label [[DOTEXECUTE_FN2:%.*]], label [[DOTCHECK_NEXT3:%.*]]
|
||||
// CHECK3: .execute.fn2:
|
||||
// CHECK3-NEXT: call void @__omp_outlined__1_wrapper(i16 0, i32 [[TMP4]]) #[[ATTR5]]
|
||||
// CHECK3-NEXT: br label [[DOTTERMINATE_PARALLEL]]
|
||||
// CHECK3: .check.next3:
|
||||
// CHECK3-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP2]] to void (i16, i32)*
|
||||
// CHECK3-NEXT: call void [[TMP7]](i16 0, i32 [[TMP4]])
|
||||
// CHECK3-NEXT: [[TMP6:%.*]] = bitcast i8* [[TMP2]] to void (i16, i32)*
|
||||
// CHECK3-NEXT: call void [[TMP6]](i16 0, i32 [[TMP4]])
|
||||
// CHECK3-NEXT: br label [[DOTTERMINATE_PARALLEL]]
|
||||
// CHECK3: .terminate.parallel:
|
||||
// CHECK3-NEXT: call void @__kmpc_kernel_end_parallel()
|
||||
@ -508,7 +487,7 @@ int main() {
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = icmp ult i32 [[NVPTX_TID]], [[THREAD_LIMIT]]
|
||||
// CHECK3-NEXT: br i1 [[TMP1]], label [[DOTWORKER:%.*]], label [[DOTMASTERCHECK:%.*]]
|
||||
// CHECK3: .worker:
|
||||
// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l25_worker() #[[ATTR5]]
|
||||
// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l25_worker() #[[ATTR4]]
|
||||
// CHECK3-NEXT: br label [[DOTEXIT:%.*]]
|
||||
// CHECK3: .mastercheck:
|
||||
// CHECK3-NEXT: [[NVPTX_TID1:%.*]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
|
||||
@ -533,7 +512,7 @@ int main() {
|
||||
// CHECK3-NEXT: [[TMP8:%.*]] = bitcast i32* [[TMP0]] to i8*
|
||||
// CHECK3-NEXT: store i8* [[TMP8]], i8** [[TMP7]], align 4
|
||||
// CHECK3-NEXT: [[TMP9:%.*]] = bitcast [1 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK3-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP9]], i32 1)
|
||||
// CHECK3-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32*)* @__omp_outlined__ to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*), i8** [[TMP9]], i32 1)
|
||||
// CHECK3-NEXT: br label [[DOTTERMINATION_NOTIFIER:%.*]]
|
||||
// CHECK3: .termination.notifier:
|
||||
// CHECK3-NEXT: call void @__kmpc_kernel_deinit(i16 1)
|
||||
@ -548,18 +527,51 @@ int main() {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [1 x i8*], align 4
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]])
|
||||
// CHECK3-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_push_num_threads(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2)
|
||||
// CHECK3-NEXT: call void @__kmpc_push_num_threads(%struct.ident_t* @[[GLOB2]], i32 [[TMP0]], i32 2)
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[CAPTURED_VARS_ADDRS]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = bitcast i32** [[C_ADDR]] to i8*
|
||||
// CHECK3-NEXT: store i8* [[TMP2]], i8** [[TMP1]], align 4
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = bitcast [1 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
|
||||
// CHECK3-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32**)* @__omp_outlined__ to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined___wrapper to i8*), i8** [[TMP3]], i32 1)
|
||||
// CHECK3-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB2]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32**)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP3]], i32 1)
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load i32*, i32** [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: call void @_Z3usePi(i32* [[TMP0]]) #[[ATTR7]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined___wrapper
|
||||
// CHECK3-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK3-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK3-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK3-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 4
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK3-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK3-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 4
|
||||
// CHECK3-NEXT: call void @__omp_outlined__(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]]) #[[ATTR4]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32** nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
@ -599,7 +611,7 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined___wrapper
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK3-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
@ -614,39 +626,6 @@ int main() {
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK3-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32***
|
||||
// CHECK3-NEXT: [[TMP5:%.*]] = load i32**, i32*** [[TMP4]], align 4
|
||||
// CHECK3-NEXT: call void @__omp_outlined__(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32** [[TMP5]]) #[[ATTR5]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[C_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[C]], i32** [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load i32*, i32** [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: call void @_Z3usePi(i32* [[TMP0]]) #[[ATTR7]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK3-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK3-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK3-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK3-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 4
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK3-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK3-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 4
|
||||
// CHECK3-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]]) #[[ATTR5]]
|
||||
// CHECK3-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32** [[TMP5]]) #[[ATTR4]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
|
@ -763,51 +763,6 @@ void unreachable_call() {
|
||||
// CHECK1-NEXT: ret i32 [[TMP20]]
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[F:%.*]], double* nonnull align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[F_ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca double*, align 8
|
||||
// CHECK1-NEXT: [[TMP:%.*]] = alloca double*, align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[F]], i32** [[F_ADDR]], align 8
|
||||
// CHECK1-NEXT: store double* [[A]], double** [[A_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[F_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load double*, double** [[A_ADDR]], align 8
|
||||
// CHECK1-NEXT: store double* [[TMP1]], double** [[TMP]], align 8
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = load double*, double** [[TMP]], align 8
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = load double, double* [[TMP2]], align 8
|
||||
// CHECK1-NEXT: [[ADD:%.*]] = fadd double 2.000000e+00, [[TMP3]]
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = fptosi double [[ADD]] to i32
|
||||
// CHECK1-NEXT: store i32 [[CONV]], i32* [[TMP0]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 8
|
||||
// CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK1-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 8
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 0
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 8
|
||||
// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 1
|
||||
// CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to double**
|
||||
// CHECK1-NEXT: [[TMP8:%.*]] = load double*, double** [[TMP7]], align 8
|
||||
// CHECK1-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]], double* [[TMP8]]) #[[ATTR2]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z16unreachable_callv_l142_worker
|
||||
// CHECK1-SAME: () #[[ATTR3]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -976,6 +931,51 @@ void unreachable_call() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[F:%.*]], double* nonnull align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[F_ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca double*, align 8
|
||||
// CHECK1-NEXT: [[TMP:%.*]] = alloca double*, align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[F]], i32** [[F_ADDR]], align 8
|
||||
// CHECK1-NEXT: store double* [[A]], double** [[A_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[F_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load double*, double** [[A_ADDR]], align 8
|
||||
// CHECK1-NEXT: store double* [[TMP1]], double** [[TMP]], align 8
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = load double*, double** [[TMP]], align 8
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = load double, double* [[TMP2]], align 8
|
||||
// CHECK1-NEXT: [[ADD:%.*]] = fadd double 2.000000e+00, [[TMP3]]
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = fptosi double [[ADD]] to i32
|
||||
// CHECK1-NEXT: store i32 [[CONV]], i32* [[TMP0]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 8
|
||||
// CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK1-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 8
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 0
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 8
|
||||
// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 1
|
||||
// CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to double**
|
||||
// CHECK1-NEXT: [[TMP8:%.*]] = load double*, double** [[TMP7]], align 8
|
||||
// CHECK1-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]], double* [[TMP8]]) #[[ATTR2]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9targetBarPiS__l25
|
||||
// CHECK2-SAME: (i32* [[PTR1:%.*]], i32** nonnull align 4 dereferenceable(4) [[PTR2:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -1592,51 +1592,6 @@ void unreachable_call() {
|
||||
// CHECK2-NEXT: ret i32 [[TMP20]]
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[F:%.*]], double* nonnull align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[F_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca double*, align 4
|
||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca double*, align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[F]], i32** [[F_ADDR]], align 4
|
||||
// CHECK2-NEXT: store double* [[A]], double** [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[F_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load double*, double** [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: store double* [[TMP1]], double** [[TMP]], align 4
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = load double*, double** [[TMP]], align 4
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = load double, double* [[TMP2]], align 8
|
||||
// CHECK2-NEXT: [[ADD:%.*]] = fadd double 2.000000e+00, [[TMP3]]
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = fptosi double [[ADD]] to i32
|
||||
// CHECK2-NEXT: store i32 [[CONV]], i32* [[TMP0]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK2-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK2-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK2-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK2-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 4
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK2-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK2-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 4
|
||||
// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 1
|
||||
// CHECK2-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to double**
|
||||
// CHECK2-NEXT: [[TMP8:%.*]] = load double*, double** [[TMP7]], align 4
|
||||
// CHECK2-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]], double* [[TMP8]]) #[[ATTR2]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z16unreachable_callv_l142_worker
|
||||
// CHECK2-SAME: () #[[ATTR3]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -1804,6 +1759,51 @@ void unreachable_call() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[F:%.*]], double* nonnull align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[F_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca double*, align 4
|
||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca double*, align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK2-NEXT: store i32* [[F]], i32** [[F_ADDR]], align 4
|
||||
// CHECK2-NEXT: store double* [[A]], double** [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[F_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load double*, double** [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: store double* [[TMP1]], double** [[TMP]], align 4
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = load double*, double** [[TMP]], align 4
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = load double, double* [[TMP2]], align 8
|
||||
// CHECK2-NEXT: [[ADD:%.*]] = fadd double 2.000000e+00, [[TMP3]]
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = fptosi double [[ADD]] to i32
|
||||
// CHECK2-NEXT: store i32 [[CONV]], i32* [[TMP0]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK2-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK2-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK2-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK2-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 4
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK2-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK2-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 4
|
||||
// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 1
|
||||
// CHECK2-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to double**
|
||||
// CHECK2-NEXT: [[TMP8:%.*]] = load double*, double** [[TMP7]], align 4
|
||||
// CHECK2-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]], double* [[TMP8]]) #[[ATTR2]]
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9targetBarPiS__l25
|
||||
// CHECK3-SAME: (i32* [[PTR1:%.*]], i32** nonnull align 4 dereferenceable(4) [[PTR2:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -2420,51 +2420,6 @@ void unreachable_call() {
|
||||
// CHECK3-NEXT: ret i32 [[TMP20]]
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[F:%.*]], double* nonnull align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[F_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca double*, align 4
|
||||
// CHECK3-NEXT: [[TMP:%.*]] = alloca double*, align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[F]], i32** [[F_ADDR]], align 4
|
||||
// CHECK3-NEXT: store double* [[A]], double** [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load i32*, i32** [[F_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load double*, double** [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: store double* [[TMP1]], double** [[TMP]], align 4
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = load double*, double** [[TMP]], align 4
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = load double, double* [[TMP2]], align 8
|
||||
// CHECK3-NEXT: [[ADD:%.*]] = fadd double 2.000000e+00, [[TMP3]]
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = fptosi double [[ADD]] to i32
|
||||
// CHECK3-NEXT: store i32 [[CONV]], i32* [[TMP0]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK3-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK3-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK3-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK3-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 4
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK3-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK3-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 4
|
||||
// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 1
|
||||
// CHECK3-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to double**
|
||||
// CHECK3-NEXT: [[TMP8:%.*]] = load double*, double** [[TMP7]], align 4
|
||||
// CHECK3-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]], double* [[TMP8]]) #[[ATTR2]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z16unreachable_callv_l142_worker
|
||||
// CHECK3-SAME: () #[[ATTR3]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -2631,3 +2586,48 @@ void unreachable_call() {
|
||||
// CHECK3: .exit:
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[F:%.*]], double* nonnull align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[F_ADDR:%.*]] = alloca i32*, align 4
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca double*, align 4
|
||||
// CHECK3-NEXT: [[TMP:%.*]] = alloca double*, align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
|
||||
// CHECK3-NEXT: store i32* [[F]], i32** [[F_ADDR]], align 4
|
||||
// CHECK3-NEXT: store double* [[A]], double** [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load i32*, i32** [[F_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load double*, double** [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: store double* [[TMP1]], double** [[TMP]], align 4
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = load double*, double** [[TMP]], align 4
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = load double, double* [[TMP2]], align 8
|
||||
// CHECK3-NEXT: [[ADD:%.*]] = fadd double 2.000000e+00, [[TMP3]]
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = fptosi double [[ADD]] to i32
|
||||
// CHECK3-NEXT: store i32 [[CONV]], i32* [[TMP0]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
|
||||
// CHECK3-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
|
||||
// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4
|
||||
// CHECK3-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
|
||||
// CHECK3-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2
|
||||
// CHECK3-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 4
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 0
|
||||
// CHECK3-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
|
||||
// CHECK3-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 4
|
||||
// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i32 1
|
||||
// CHECK3-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to double**
|
||||
// CHECK3-NEXT: [[TMP8:%.*]] = load double*, double** [[TMP7]], align 4
|
||||
// CHECK3-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]], double* [[TMP8]]) #[[ATTR2]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
|
@ -2468,15 +2468,8 @@ void range_for_collapsed() {
|
||||
// CHECK2-NEXT: unreachable
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z3foov
|
||||
// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @_Z8mayThrowv()
|
||||
// CHECK3-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z17with_var_schedulev
|
||||
// CHECK3-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A:%.*]] = alloca double, align 8
|
||||
// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 1
|
||||
@ -2494,7 +2487,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3:[0-9]+]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2603,7 +2596,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z23without_schedule_clausePfS_S_S_
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR2]] {
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -2618,7 +2611,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..1
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2712,7 +2705,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z18static_not_chunkedPfS_S_S_
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR2]] {
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -2727,7 +2720,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..2
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2821,7 +2814,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z14static_chunkedPfS_S_S_
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR2]] {
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -2836,7 +2829,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..3
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2947,7 +2940,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z8dynamic1PfS_S_S_
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR2]] {
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -2962,7 +2955,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..4
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3049,7 +3042,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z7guided7PfS_S_S_
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR2]] {
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -3064,7 +3057,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..5
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3151,7 +3144,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z9test_autoPfS_S_S_
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR2]] {
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -3170,7 +3163,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..6
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[Y:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[Y:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3308,7 +3301,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z7runtimePfS_S_S_
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR2]] {
|
||||
// CHECK3-SAME: (float* [[A:%.*]], float* [[B:%.*]], float* [[C:%.*]], float* [[D:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8
|
||||
@ -3325,7 +3318,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..7
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], float** nonnull align 8 dereferenceable(8) [[B:%.*]], float** nonnull align 8 dereferenceable(8) [[C:%.*]], float** nonnull align 8 dereferenceable(8) [[D:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3426,8 +3419,15 @@ void range_for_collapsed() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z3foov
|
||||
// CHECK3-SAME: () #[[ATTR3:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @_Z8mayThrowv()
|
||||
// CHECK3-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z12parallel_forPfi
|
||||
// CHECK3-SAME: (float* [[A:%.*]], i32 [[N:%.*]]) #[[ATTR2]] {
|
||||
// CHECK3-SAME: (float* [[A:%.*]], i32 [[N:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8
|
||||
// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -3453,7 +3453,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..8
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], i64 [[VLA:%.*]], i64 [[N:%.*]]) #[[ATTR3]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], float** nonnull align 8 dereferenceable(8) [[A:%.*]], i64 [[VLA:%.*]], i64 [[N:%.*]]) #[[ATTR1]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3577,7 +3577,7 @@ void range_for_collapsed() {
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__clang_call_terminate
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]]) #[[ATTR6:[0-9]+]] comdat {
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR4:[0-9]+]]
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR2:[0-9]+]]
|
||||
// CHECK3-NEXT: call void @_ZSt9terminatev() #[[ATTR7]]
|
||||
// CHECK3-NEXT: unreachable
|
||||
//
|
||||
|
@ -50,28 +50,8 @@ struct S {
|
||||
|
||||
|
||||
#endif
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK1-SAME: () #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: call void @_ZN1SC1Ei(%struct.S* nonnull dereferenceable(4) @s, i32 1)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SC1Ei
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32 [[C]], i32* [[C_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load i32, i32* [[C_ADDR]], align 4
|
||||
// CHECK1-NEXT: call void @_ZN1SC2Ei(%struct.S* nonnull dereferenceable(4) [[THIS1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@main
|
||||
// CHECK1-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK1-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -131,7 +111,7 @@ struct S {
|
||||
// CHECK1: omp_if.else:
|
||||
// CHECK1-NEXT: call void @__kmpc_serialized_parallel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: store i32 [[TMP0]], i32* [[DOTTHREADID_TEMP_]], align 4
|
||||
// CHECK1-NEXT: call void @.omp_outlined..5(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTBOUND_ZERO_ADDR]], i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]], i64 [[TMP10]], i64 [[TMP12]]) #[[ATTR4:[0-9]+]]
|
||||
// CHECK1-NEXT: call void @.omp_outlined..5(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTBOUND_ZERO_ADDR]], i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]], i64 [[TMP10]], i64 [[TMP12]]) #[[ATTR2:[0-9]+]]
|
||||
// CHECK1-NEXT: call void @__kmpc_end_serialized_parallel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: br label [[OMP_IF_END]]
|
||||
// CHECK1: omp_if.end:
|
||||
@ -141,7 +121,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3:[0-9]+]] {
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -185,7 +165,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry.
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR6:[0-9]+]] {
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -261,7 +241,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..2
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -301,7 +281,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry..4
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -377,7 +357,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..5
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -474,7 +454,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry..7
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -635,7 +615,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..8
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -672,7 +652,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry..10
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.5* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.5* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -741,7 +721,7 @@ struct S {
|
||||
// CHECK1-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IV_I]], align 4, !noalias !51
|
||||
// CHECK1-NEXT: store i32 [[TMP24]], i32* [[I_I]], align 4, !noalias !51
|
||||
// CHECK1-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !51
|
||||
// CHECK1-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP25]], i32 4) #[[ATTR4]]
|
||||
// CHECK1-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP25]], i32 4) #[[ATTR2]]
|
||||
// CHECK1-NEXT: [[TMP27:%.*]] = icmp ne i32 [[TMP26]], 0
|
||||
// CHECK1-NEXT: br i1 [[TMP27]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
|
||||
// CHECK1: .cancel.exit.i:
|
||||
@ -749,7 +729,7 @@ struct S {
|
||||
// CHECK1-NEXT: br label [[DOTOMP_OUTLINED__9_EXIT:%.*]]
|
||||
// CHECK1: .cancel.continue.i:
|
||||
// CHECK1-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !51
|
||||
// CHECK1-NEXT: [[TMP29:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]], i32 4) #[[ATTR4]]
|
||||
// CHECK1-NEXT: [[TMP29:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]], i32 4) #[[ATTR2]]
|
||||
// CHECK1-NEXT: [[TMP30:%.*]] = icmp ne i32 [[TMP29]], 0
|
||||
// CHECK1-NEXT: br i1 [[TMP30]], label [[DOTCANCEL_EXIT2_I:%.*]], label [[DOTCANCEL_CONTINUE3_I:%.*]]
|
||||
// CHECK1: .cancel.exit2.i:
|
||||
@ -768,8 +748,28 @@ struct S {
|
||||
// CHECK1-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK1-SAME: () #[[ATTR7:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: call void @_ZN1SC1Ei(%struct.S* nonnull dereferenceable(4) @s, i32 1)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SC1Ei
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32 [[C]], i32* [[C_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load i32, i32* [[C_ADDR]], align 4
|
||||
// CHECK1-NEXT: call void @_ZN1SC2Ei(%struct.S* nonnull dereferenceable(4) [[THIS1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SC2Ei
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR8]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -793,7 +793,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..11
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S* [[THIS:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S* [[THIS:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -864,7 +864,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry..13
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.7* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.7* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -970,34 +970,14 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_parallel_master_taskloop_codegen.cpp
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-SAME: () #[[ATTR7]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: call void @__cxx_global_var_init()
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK2-SAME: () #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void @_ZN1SC1Ei(%struct.S* nonnull dereferenceable(4) @s, i32 1)
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SC1Ei
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: store i32 [[C]], i32* [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: call void @_ZN1SC2Ei(%struct.S* nonnull dereferenceable(4) [[THIS1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@main
|
||||
// CHECK2-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK2-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -1057,7 +1037,7 @@ struct S {
|
||||
// CHECK2: omp_if.else:
|
||||
// CHECK2-NEXT: call void @__kmpc_serialized_parallel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: store i32 [[TMP0]], i32* [[DOTTHREADID_TEMP_]], align 4
|
||||
// CHECK2-NEXT: call void @.omp_outlined..5(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTBOUND_ZERO_ADDR]], i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]], i64 [[TMP10]], i64 [[TMP12]]) #[[ATTR4:[0-9]+]]
|
||||
// CHECK2-NEXT: call void @.omp_outlined..5(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTBOUND_ZERO_ADDR]], i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]], i64 [[TMP10]], i64 [[TMP12]]) #[[ATTR2:[0-9]+]]
|
||||
// CHECK2-NEXT: call void @__kmpc_end_serialized_parallel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: br label [[OMP_IF_END]]
|
||||
// CHECK2: omp_if.end:
|
||||
@ -1067,7 +1047,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3:[0-9]+]] {
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -1111,7 +1091,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry.
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR6:[0-9]+]] {
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -1187,7 +1167,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..2
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -1227,7 +1207,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry..4
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -1303,7 +1283,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..5
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -1400,7 +1380,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry..7
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -1561,7 +1541,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..8
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -1598,7 +1578,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry..10
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.5* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.5* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -1667,7 +1647,7 @@ struct S {
|
||||
// CHECK2-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IV_I]], align 4, !noalias !51
|
||||
// CHECK2-NEXT: store i32 [[TMP24]], i32* [[I_I]], align 4, !noalias !51
|
||||
// CHECK2-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !51
|
||||
// CHECK2-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP25]], i32 4) #[[ATTR4]]
|
||||
// CHECK2-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP25]], i32 4) #[[ATTR2]]
|
||||
// CHECK2-NEXT: [[TMP27:%.*]] = icmp ne i32 [[TMP26]], 0
|
||||
// CHECK2-NEXT: br i1 [[TMP27]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
|
||||
// CHECK2: .cancel.exit.i:
|
||||
@ -1675,7 +1655,7 @@ struct S {
|
||||
// CHECK2-NEXT: br label [[DOTOMP_OUTLINED__9_EXIT:%.*]]
|
||||
// CHECK2: .cancel.continue.i:
|
||||
// CHECK2-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !51
|
||||
// CHECK2-NEXT: [[TMP29:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]], i32 4) #[[ATTR4]]
|
||||
// CHECK2-NEXT: [[TMP29:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]], i32 4) #[[ATTR2]]
|
||||
// CHECK2-NEXT: [[TMP30:%.*]] = icmp ne i32 [[TMP29]], 0
|
||||
// CHECK2-NEXT: br i1 [[TMP30]], label [[DOTCANCEL_EXIT2_I:%.*]], label [[DOTCANCEL_CONTINUE3_I:%.*]]
|
||||
// CHECK2: .cancel.exit2.i:
|
||||
@ -1694,8 +1674,28 @@ struct S {
|
||||
// CHECK2-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK2-SAME: () #[[ATTR7:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void @_ZN1SC1Ei(%struct.S* nonnull dereferenceable(4) @s, i32 1)
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SC1Ei
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: store i32 [[C]], i32* [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[C_ADDR]], align 4
|
||||
// CHECK2-NEXT: call void @_ZN1SC2Ei(%struct.S* nonnull dereferenceable(4) [[THIS1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SC2Ei
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR8]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -1719,7 +1719,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..11
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S* [[THIS:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S* [[THIS:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -1790,7 +1790,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry..13
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.7* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.7* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -1896,7 +1896,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_parallel_master_taskloop_codegen.cpp
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-SAME: () #[[ATTR7]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void @__cxx_global_var_init()
|
||||
// CHECK2-NEXT: ret void
|
||||
|
@ -1743,28 +1743,8 @@ struct S {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK3-SAME: () #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @_ZN1SC1Ei(%struct.S* nonnull dereferenceable(4) @s, i32 1)
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SC1Ei
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: store i32 [[C]], i32* [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: call void @_ZN1SC2Ei(%struct.S* nonnull dereferenceable(4) [[THIS1]], i32 [[TMP0]])
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@main
|
||||
// CHECK3-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK3-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -1824,7 +1804,7 @@ struct S {
|
||||
// CHECK3: omp_if.else:
|
||||
// CHECK3-NEXT: call void @__kmpc_serialized_parallel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK3-NEXT: store i32 [[TMP0]], i32* [[DOTTHREADID_TEMP_]], align 4
|
||||
// CHECK3-NEXT: call void @.omp_outlined..5(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTBOUND_ZERO_ADDR]], i32* [[I]], i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]], i64 [[TMP10]], i64 [[TMP12]]) #[[ATTR4:[0-9]+]]
|
||||
// CHECK3-NEXT: call void @.omp_outlined..5(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTBOUND_ZERO_ADDR]], i32* [[I]], i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]], i64 [[TMP10]], i64 [[TMP12]]) #[[ATTR2:[0-9]+]]
|
||||
// CHECK3-NEXT: call void @__kmpc_end_serialized_parallel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK3-NEXT: br label [[OMP_IF_END]]
|
||||
// CHECK3: omp_if.end:
|
||||
@ -1833,7 +1813,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3:[0-9]+]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -1877,7 +1857,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_task_entry.
|
||||
// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR6:[0-9]+]] {
|
||||
// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -1953,7 +1933,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..2
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -1993,7 +1973,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_task_entry..4
|
||||
// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -2069,7 +2049,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..5
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[I:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[I:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2177,7 +2157,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_task_privates_map.
|
||||
// CHECK3-SAME: (%struct..kmp_privates.t* noalias [[TMP0:%.*]], i32** noalias [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-SAME: (%struct..kmp_privates.t* noalias [[TMP0:%.*]], i32** noalias [[TMP1:%.*]]) #[[ATTR6:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca %struct..kmp_privates.t*, align 8
|
||||
// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32**, align 8
|
||||
@ -2191,7 +2171,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_task_entry..7
|
||||
// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -2258,7 +2238,7 @@ struct S {
|
||||
// CHECK3-NEXT: [[TMP23:%.*]] = load void (i8*, ...)*, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !46
|
||||
// CHECK3-NEXT: [[TMP24:%.*]] = load i8*, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !46
|
||||
// CHECK3-NEXT: [[TMP25:%.*]] = bitcast void (i8*, ...)* [[TMP23]] to void (i8*, i32**)*
|
||||
// CHECK3-NEXT: call void [[TMP25]](i8* [[TMP24]], i32** [[DOTLASTPRIV_PTR_ADDR_I]]) #[[ATTR4]]
|
||||
// CHECK3-NEXT: call void [[TMP25]](i8* [[TMP24]], i32** [[DOTLASTPRIV_PTR_ADDR_I]]) #[[ATTR2]]
|
||||
// CHECK3-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_ANON_2:%.*]], %struct.anon.2* [[TMP22]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP27:%.*]] = load i32*, i32** [[TMP26]], align 8
|
||||
// CHECK3-NEXT: [[TMP28:%.*]] = load i32*, i32** [[DOTLASTPRIV_PTR_ADDR_I]], align 8, !noalias !46
|
||||
@ -2418,7 +2398,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_task_dup.
|
||||
// CHECK3-SAME: (%struct.kmp_task_t_with_privates.3* [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* [[TMP1:%.*]], i32 [[TMP2:%.*]]) #[[ATTR6]] {
|
||||
// CHECK3-SAME: (%struct.kmp_task_t_with_privates.3* [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* [[TMP1:%.*]], i32 [[TMP2:%.*]]) #[[ATTR4]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca %struct.kmp_task_t_with_privates.3*, align 8
|
||||
// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates.3*, align 8
|
||||
@ -2435,8 +2415,28 @@ struct S {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK3-SAME: () #[[ATTR6]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @_ZN1SC1Ei(%struct.S* nonnull dereferenceable(4) @s, i32 1)
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SC1Ei
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: store i32 [[C]], i32* [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[C_ADDR]], align 4
|
||||
// CHECK3-NEXT: call void @_ZN1SC2Ei(%struct.S* nonnull dereferenceable(4) [[THIS1]], i32 [[TMP0]])
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SC2Ei
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR8]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -2460,7 +2460,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..8
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S* [[THIS:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S* [[THIS:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2531,7 +2531,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_task_entry..10
|
||||
// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.5* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.5* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -2637,34 +2637,14 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_parallel_master_taskloop_simd_codegen.cpp
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-SAME: () #[[ATTR6]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @__cxx_global_var_init()
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK4-SAME: () #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: call void @_ZN1SC1Ei(%struct.S* nonnull dereferenceable(4) @s, i32 1)
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SC1Ei
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: store i32 [[C]], i32* [[C_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[C_ADDR]], align 4
|
||||
// CHECK4-NEXT: call void @_ZN1SC2Ei(%struct.S* nonnull dereferenceable(4) [[THIS1]], i32 [[TMP0]])
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@main
|
||||
// CHECK4-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK4-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK4-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -2724,7 +2704,7 @@ struct S {
|
||||
// CHECK4: omp_if.else:
|
||||
// CHECK4-NEXT: call void @__kmpc_serialized_parallel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK4-NEXT: store i32 [[TMP0]], i32* [[DOTTHREADID_TEMP_]], align 4
|
||||
// CHECK4-NEXT: call void @.omp_outlined..5(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTBOUND_ZERO_ADDR]], i32* [[I]], i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]], i64 [[TMP10]], i64 [[TMP12]]) #[[ATTR4:[0-9]+]]
|
||||
// CHECK4-NEXT: call void @.omp_outlined..5(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTBOUND_ZERO_ADDR]], i32* [[I]], i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]], i64 [[TMP10]], i64 [[TMP12]]) #[[ATTR2:[0-9]+]]
|
||||
// CHECK4-NEXT: call void @__kmpc_end_serialized_parallel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK4-NEXT: br label [[OMP_IF_END]]
|
||||
// CHECK4: omp_if.end:
|
||||
@ -2733,7 +2713,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3:[0-9]+]] {
|
||||
// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2777,7 +2757,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_task_entry.
|
||||
// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR6:[0-9]+]] {
|
||||
// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK4-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -2853,7 +2833,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..2
|
||||
// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2893,7 +2873,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_task_entry..4
|
||||
// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK4-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -2969,7 +2949,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..5
|
||||
// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[I:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR3]] {
|
||||
// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[I:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3077,7 +3057,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_task_privates_map.
|
||||
// CHECK4-SAME: (%struct..kmp_privates.t* noalias [[TMP0:%.*]], i32** noalias [[TMP1:%.*]]) #[[ATTR0]] {
|
||||
// CHECK4-SAME: (%struct..kmp_privates.t* noalias [[TMP0:%.*]], i32** noalias [[TMP1:%.*]]) #[[ATTR6:[0-9]+]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca %struct..kmp_privates.t*, align 8
|
||||
// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca i32**, align 8
|
||||
@ -3091,7 +3071,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_task_entry..7
|
||||
// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK4-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -3158,7 +3138,7 @@ struct S {
|
||||
// CHECK4-NEXT: [[TMP23:%.*]] = load void (i8*, ...)*, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !46
|
||||
// CHECK4-NEXT: [[TMP24:%.*]] = load i8*, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !46
|
||||
// CHECK4-NEXT: [[TMP25:%.*]] = bitcast void (i8*, ...)* [[TMP23]] to void (i8*, i32**)*
|
||||
// CHECK4-NEXT: call void [[TMP25]](i8* [[TMP24]], i32** [[DOTLASTPRIV_PTR_ADDR_I]]) #[[ATTR4]]
|
||||
// CHECK4-NEXT: call void [[TMP25]](i8* [[TMP24]], i32** [[DOTLASTPRIV_PTR_ADDR_I]]) #[[ATTR2]]
|
||||
// CHECK4-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_ANON_2:%.*]], %struct.anon.2* [[TMP22]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP27:%.*]] = load i32*, i32** [[TMP26]], align 8
|
||||
// CHECK4-NEXT: [[TMP28:%.*]] = load i32*, i32** [[DOTLASTPRIV_PTR_ADDR_I]], align 8, !noalias !46
|
||||
@ -3318,7 +3298,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_task_dup.
|
||||
// CHECK4-SAME: (%struct.kmp_task_t_with_privates.3* [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* [[TMP1:%.*]], i32 [[TMP2:%.*]]) #[[ATTR6]] {
|
||||
// CHECK4-SAME: (%struct.kmp_task_t_with_privates.3* [[TMP0:%.*]], %struct.kmp_task_t_with_privates.3* [[TMP1:%.*]], i32 [[TMP2:%.*]]) #[[ATTR4]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca %struct.kmp_task_t_with_privates.3*, align 8
|
||||
// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates.3*, align 8
|
||||
@ -3335,8 +3315,28 @@ struct S {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK4-SAME: () #[[ATTR6]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: call void @_ZN1SC1Ei(%struct.S* nonnull dereferenceable(4) @s, i32 1)
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SC1Ei
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: store i32 [[C]], i32* [[C_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[C_ADDR]], align 4
|
||||
// CHECK4-NEXT: call void @_ZN1SC2Ei(%struct.S* nonnull dereferenceable(4) [[THIS1]], i32 [[TMP0]])
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SC2Ei
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], i32 [[C:%.*]]) unnamed_addr #[[ATTR8]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -3360,7 +3360,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..8
|
||||
// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S* [[THIS:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
|
||||
// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S* [[THIS:%.*]], i32* nonnull align 4 dereferenceable(4) [[C:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3431,7 +3431,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_task_entry..10
|
||||
// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.5* noalias [[TMP1:%.*]]) #[[ATTR6]] {
|
||||
// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates.5* noalias [[TMP1:%.*]]) #[[ATTR4]] {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
|
||||
// CHECK4-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
|
||||
@ -3537,7 +3537,7 @@ struct S {
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_parallel_master_taskloop_simd_codegen.cpp
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-SAME: () #[[ATTR6]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: call void @__cxx_global_var_init()
|
||||
// CHECK4-NEXT: ret void
|
||||
|
@ -4,20 +4,18 @@
|
||||
|
||||
// host-no-diagnostics
|
||||
|
||||
void bar1(void) { // all-remark {{[OMP100] Potentially unknown OpenMP target region caller}}
|
||||
void bar1(void) {
|
||||
#pragma omp parallel // #0
|
||||
// all-remark@#0 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}}
|
||||
// safe-remark@#0 {{Parallel region is not known to be called from a unique single target region, maybe the surrounding function has external linkage?; will not attempt to rewrite the state machine use.}}
|
||||
// force-remark@#0 {{[UNSAFE] Parallel region is not known to be called from a unique single target region, maybe the surrounding function has external linkage?; will rewrite the state machine use due to command line flag, this can lead to undefined behavior if the parallel region is called from a target region outside this translation unit.}}
|
||||
// safe-remark@#0 {{Parallel region is used in unexpected ways; will not attempt to rewrite the state machine.}}
|
||||
// force-remark@#0 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__2_wrapper, kernel ID: <NONE>}}
|
||||
{
|
||||
}
|
||||
}
|
||||
void bar2(void) { // all-remark {{[OMP100] Potentially unknown OpenMP target region caller}}
|
||||
void bar2(void) {
|
||||
#pragma omp parallel // #1
|
||||
// all-remark@#1 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}}
|
||||
// safe-remark@#1 {{Parallel region is not known to be called from a unique single target region, maybe the surrounding function has external linkage?; will not attempt to rewrite the state machine use.}}
|
||||
// force-remark@#1 {{[UNSAFE] Parallel region is not known to be called from a unique single target region, maybe the surrounding function has external linkage?; will rewrite the state machine use due to command line flag, this can lead to undefined behavior if the parallel region is called from a target region outside this translation unit.}}
|
||||
// safe-remark@#1 {{Parallel region is used in unexpected ways; will not attempt to rewrite the state machine.}}
|
||||
// force-remark@#1 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__6_wrapper, kernel ID: <NONE>}}
|
||||
{
|
||||
}
|
||||
@ -26,7 +24,7 @@ void bar2(void) { // all-remark {{[OMP100] Potentially unknown OpenMP target
|
||||
void foo1(void) {
|
||||
#pragma omp target teams // #2
|
||||
// all-remark@#2 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__1_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#2 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__3_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#2 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__2_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
#pragma omp parallel // #3
|
||||
// all-remark@#3 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}}
|
||||
@ -36,7 +34,7 @@ void foo1(void) {
|
||||
bar1();
|
||||
#pragma omp parallel // #4
|
||||
// all-remark@#4 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}}
|
||||
// all-remark@#4 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__3_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#4 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__2_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -45,18 +43,18 @@ void foo1(void) {
|
||||
void foo2(void) {
|
||||
#pragma omp target teams // #5
|
||||
// all-remark@#5 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__5_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#5 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__7_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#5 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__4_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
#pragma omp parallel // #6
|
||||
// all-remark@#6 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}}
|
||||
// all-remark@#6 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__5_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#6 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__4_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
}
|
||||
bar1();
|
||||
bar2();
|
||||
#pragma omp parallel // #7
|
||||
// all-remark@#7 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}}
|
||||
// all-remark@#7 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__7_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#7 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__5_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
}
|
||||
bar1();
|
||||
@ -66,19 +64,19 @@ void foo2(void) {
|
||||
|
||||
void foo3(void) {
|
||||
#pragma omp target teams // #8
|
||||
// all-remark@#8 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__9_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#8 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__10_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#8 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__7_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#8 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__8_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
#pragma omp parallel // #9
|
||||
// all-remark@#9 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}}
|
||||
// all-remark@#9 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__9_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#9 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__7_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
}
|
||||
bar1();
|
||||
bar2();
|
||||
#pragma omp parallel // #10
|
||||
// all-remark@#10 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}}
|
||||
// all-remark@#10 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__10_wrapper, kernel ID: __omp_offloading}}
|
||||
// all-remark@#10 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__8_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
}
|
||||
bar1();
|
||||
|
@ -4,10 +4,10 @@
|
||||
|
||||
// host-no-diagnostics
|
||||
|
||||
void bar(void) { // expected-remark {{[OMP100] Potentially unknown OpenMP target region caller}}
|
||||
void bar(void) {
|
||||
#pragma omp parallel // #1 \
|
||||
// expected-remark@#1 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}} \
|
||||
// expected-remark@#1 {{Parallel region is not known to be called from a unique single target region, maybe the surrounding function has external linkage?; will not attempt to rewrite the state machine use.}}
|
||||
// expected-remark@#1 {{Parallel region is used in unexpected ways; will not attempt to rewrite the state machine.}}
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -15,7 +15,7 @@ void bar(void) { // expected-remark {{[OMP100] Potentially unknown OpenMP ta
|
||||
void foo(void) {
|
||||
#pragma omp target teams // #2 \
|
||||
// expected-remark@#2 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__1_wrapper, kernel ID: __omp_offloading}} \
|
||||
// expected-remark@#2 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__3_wrapper, kernel ID: __omp_offloading}}
|
||||
// expected-remark@#2 {{Target region containing the parallel region that is specialized. (parallel region ID: __omp_outlined__2_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
#pragma omp parallel // #3 \
|
||||
// expected-remark@#3 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}} \
|
||||
@ -25,7 +25,7 @@ void foo(void) {
|
||||
bar();
|
||||
#pragma omp parallel // #4 \
|
||||
// expected-remark@#4 {{Found a parallel region that is called in a target region but not part of a combined target construct nor nested inside a target construct without intermediate code. This can lead to excessive register usage for unrelated target regions in the same translation unit due to spurious call edges assumed by ptxas.}} \
|
||||
// expected-remark@#4 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__3_wrapper, kernel ID: __omp_offloading}}
|
||||
// expected-remark@#4 {{Specialize parallel region that is only reached from a single target region to avoid spurious call edges and excessive register usage in other target regions. (parallel region ID: __omp_outlined__2_wrapper, kernel ID: __omp_offloading}}
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -175,6 +175,28 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK1-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -213,6 +235,23 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK1-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -650,45 +689,6 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK1-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK1-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_sections_firstprivate_codegen.cpp
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -726,6 +726,28 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK2-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -764,6 +786,23 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK2-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK2-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -1201,45 +1240,6 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK2-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK2-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK2-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_sections_firstprivate_codegen.cpp
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -1277,6 +1277,28 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK3-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1315,6 +1337,23 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK3-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK3-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1406,45 +1445,6 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK3-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK3-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK3-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_sections_firstprivate_codegen.cpp
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1482,6 +1482,28 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK4-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
@ -1520,6 +1542,23 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK4-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK4-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
@ -1673,45 +1712,6 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK4-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK4-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK4-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_sections_firstprivate_codegen.cpp
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
|
@ -143,12 +143,16 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
|
||||
|
||||
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) @tc)
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(void (i8*)* bitcast (void (%class.TestClass*)* @_ZN9TestClassD1Ev to void (i8*)*), i8* bitcast (%class.TestClass* @tc to i8*), i8* @__dso_handle) #[[ATTR3:[0-9]+]]
|
||||
// CHECK1-NEXT: ret void
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]])
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: ret i8* [[TMP3]]
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev
|
||||
@ -161,6 +165,17 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_.
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]]) #[[ATTR3:[0-9]+]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev
|
||||
// CHECK1-SAME: (%class.TestClass* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -171,7 +186,98 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_.
|
||||
// CHECK1-SAME: () #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK1-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast (%class.TestClass* @tc to i8*), i8* (i8*)* @.__kmpc_global_ctor_., i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_.)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..1
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to [2 x %class.TestClass]*
|
||||
// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], [2 x %class.TestClass]* [[TMP2]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAY_BEGIN]], i64 2
|
||||
// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]
|
||||
// CHECK1: arrayctor.loop:
|
||||
// CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.TestClass* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]
|
||||
// CHECK1-NEXT: invoke void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]])
|
||||
// CHECK1-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]
|
||||
// CHECK1: invoke.cont:
|
||||
// CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYCTOR_CUR]], i64 1
|
||||
// CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]
|
||||
// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
|
||||
// CHECK1: arrayctor.cont:
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: ret i8* [[TMP3]]
|
||||
// CHECK1: lpad:
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK1-NEXT: cleanup
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 0
|
||||
// CHECK1-NEXT: store i8* [[TMP5]], i8** [[EXN_SLOT]], align 8
|
||||
// CHECK1-NEXT: [[TMP6:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 1
|
||||
// CHECK1-NEXT: store i32 [[TMP6]], i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq %class.TestClass* [[ARRAY_BEGIN]], [[ARRAYCTOR_CUR]]
|
||||
// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]
|
||||
// CHECK1: arraydestroy.body:
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]
|
||||
// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]
|
||||
// CHECK1: arraydestroy.done1:
|
||||
// CHECK1-NEXT: br label [[EH_RESUME:%.*]]
|
||||
// CHECK1: eh.resume:
|
||||
// CHECK1-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
// CHECK1-NEXT: [[SEL:%.*]] = load i32, i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK1-NEXT: [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[EXN]], 0
|
||||
// CHECK1-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[SEL]], 1
|
||||
// CHECK1-NEXT: resume { i8*, i32 } [[LPAD_VAL2]]
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..2
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAY_BEGIN]], i64 2
|
||||
// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]
|
||||
// CHECK1: arraydestroy.body:
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[TMP2]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]
|
||||
// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]
|
||||
// CHECK1: arraydestroy.done1:
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_..3
|
||||
// CHECK1-SAME: () #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK1-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast ([2 x %class.TestClass]* @tc2 to i8*), i8* (i8*)* @.__kmpc_global_ctor_..1, i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_..2)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK1-SAME: () #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) @tc)
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(void (i8*)* bitcast (void (%class.TestClass*)* @_ZN9TestClassD1Ev to void (i8*)*), i8* bitcast (%class.TestClass* @tc to i8*), i8* @__dso_handle) #[[ATTR3]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
|
||||
// CHECK1-SAME: () #[[ATTR0]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
@ -229,112 +335,6 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]])
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: ret i8* [[TMP3]]
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_.
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]]) #[[ATTR3]]
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_.
|
||||
// CHECK1-SAME: () #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK1-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast (%class.TestClass* @tc to i8*), i8* (i8*)* @.__kmpc_global_ctor_., i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_.)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..2
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to [2 x %class.TestClass]*
|
||||
// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], [2 x %class.TestClass]* [[TMP2]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAY_BEGIN]], i64 2
|
||||
// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]
|
||||
// CHECK1: arrayctor.loop:
|
||||
// CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.TestClass* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]
|
||||
// CHECK1-NEXT: invoke void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]])
|
||||
// CHECK1-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]
|
||||
// CHECK1: invoke.cont:
|
||||
// CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYCTOR_CUR]], i64 1
|
||||
// CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]
|
||||
// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
|
||||
// CHECK1: arrayctor.cont:
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: ret i8* [[TMP3]]
|
||||
// CHECK1: lpad:
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK1-NEXT: cleanup
|
||||
// CHECK1-NEXT: [[TMP5:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 0
|
||||
// CHECK1-NEXT: store i8* [[TMP5]], i8** [[EXN_SLOT]], align 8
|
||||
// CHECK1-NEXT: [[TMP6:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 1
|
||||
// CHECK1-NEXT: store i32 [[TMP6]], i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq %class.TestClass* [[ARRAY_BEGIN]], [[ARRAYCTOR_CUR]]
|
||||
// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]
|
||||
// CHECK1: arraydestroy.body:
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]
|
||||
// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]
|
||||
// CHECK1: arraydestroy.done1:
|
||||
// CHECK1-NEXT: br label [[EH_RESUME:%.*]]
|
||||
// CHECK1: eh.resume:
|
||||
// CHECK1-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
// CHECK1-NEXT: [[SEL:%.*]] = load i32, i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK1-NEXT: [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[EXN]], 0
|
||||
// CHECK1-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[SEL]], 1
|
||||
// CHECK1-NEXT: resume { i8*, i32 } [[LPAD_VAL2]]
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..3
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAY_BEGIN]], i64 2
|
||||
// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]
|
||||
// CHECK1: arraydestroy.body:
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[TMP2]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
|
||||
// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
|
||||
// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]
|
||||
// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]
|
||||
// CHECK1: arraydestroy.done1:
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_..4
|
||||
// CHECK1-SAME: () #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK1-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast ([2 x %class.TestClass]* @tc2 to i8*), i8* (i8*)* @.__kmpc_global_ctor_..2, i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_..3)
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev
|
||||
// CHECK1-SAME: (%class.TestClass* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -1146,9 +1146,9 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK1-SAME: () #[[ATTR0]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: call void @__cxx_global_var_init()
|
||||
// CHECK1-NEXT: call void @__cxx_global_var_init.1()
|
||||
// CHECK1-NEXT: call void @__cxx_global_var_init.4()
|
||||
// CHECK1-NEXT: call void @.__omp_threadprivate_init_.()
|
||||
// CHECK1-NEXT: call void @.__omp_threadprivate_init_..4()
|
||||
// CHECK1-NEXT: call void @.__omp_threadprivate_init_..3()
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
@ -2161,18 +2161,8 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK3-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast (%class.TestClass* @tc to i8*), i8* (i8*)* @.__kmpc_global_ctor_., i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_.)
|
||||
// CHECK3-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) @tc)
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = call i32 @__cxa_atexit(void (i8*)* bitcast (void (%class.TestClass*)* @_ZN9TestClassD1Ev to void (i8*)*), i8* bitcast (%class.TestClass* @tc to i8*), i8* @__dso_handle) #[[ATTR3:[0-9]+]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK3-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
@ -2200,7 +2190,7 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*
|
||||
// CHECK3-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]]) #[[ATTR3]]
|
||||
// CHECK3-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]]) #[[ATTR3:[0-9]+]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
@ -2214,51 +2204,15 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK3-SAME: () #[[ATTR0]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_.
|
||||
// CHECK3-SAME: () #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK3-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK3-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast ([2 x %class.TestClass]* @tc2 to i8*), i8* (i8*)* @.__kmpc_global_ctor_..2, i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_..3)
|
||||
// CHECK3-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]
|
||||
// CHECK3: arrayctor.loop:
|
||||
// CHECK3-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.TestClass* [ getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]
|
||||
// CHECK3-NEXT: invoke void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]])
|
||||
// CHECK3-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]
|
||||
// CHECK3: invoke.cont:
|
||||
// CHECK3-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAYCTOR_CUR]], i64 1
|
||||
// CHECK3-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), i64 2)
|
||||
// CHECK3-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
|
||||
// CHECK3: arrayctor.cont:
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = call i32 @__cxa_atexit(void (i8*)* @__cxx_global_array_dtor, i8* null, i8* @__dso_handle) #[[ATTR3]]
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK3-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast (%class.TestClass* @tc to i8*), i8* (i8*)* @.__kmpc_global_ctor_., i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_.)
|
||||
// CHECK3-NEXT: ret void
|
||||
// CHECK3: lpad:
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK3-NEXT: cleanup
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 0
|
||||
// CHECK3-NEXT: store i8* [[TMP3]], i8** [[EXN_SLOT]], align 8
|
||||
// CHECK3-NEXT: [[TMP4:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 1
|
||||
// CHECK3-NEXT: store i32 [[TMP4]], i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK3-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), [[ARRAYCTOR_CUR]]
|
||||
// CHECK3-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]
|
||||
// CHECK3: arraydestroy.body:
|
||||
// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
|
||||
// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
|
||||
// CHECK3-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
|
||||
// CHECK3-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0)
|
||||
// CHECK3-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]
|
||||
// CHECK3: arraydestroy.done1:
|
||||
// CHECK3-NEXT: br label [[EH_RESUME:%.*]]
|
||||
// CHECK3: eh.resume:
|
||||
// CHECK3-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
// CHECK3-NEXT: [[SEL:%.*]] = load i32, i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK3-NEXT: [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[EXN]], 0
|
||||
// CHECK3-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[SEL]], 1
|
||||
// CHECK3-NEXT: resume { i8*, i32 } [[LPAD_VAL2]]
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..2
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..1
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
@ -2306,7 +2260,7 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: resume { i8*, i32 } [[LPAD_VAL2]]
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..3
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..2
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
@ -2325,6 +2279,64 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_..3
|
||||
// CHECK3-SAME: () #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
|
||||
// CHECK3-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast ([2 x %class.TestClass]* @tc2 to i8*), i8* (i8*)* @.__kmpc_global_ctor_..1, i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_..2)
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK3-SAME: () #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) @tc)
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(void (i8*)* bitcast (void (%class.TestClass*)* @_ZN9TestClassD1Ev to void (i8*)*), i8* bitcast (%class.TestClass* @tc to i8*), i8* @__dso_handle) #[[ATTR3]]
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
|
||||
// CHECK3-SAME: () #[[ATTR0]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK3-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK3-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]
|
||||
// CHECK3: arrayctor.loop:
|
||||
// CHECK3-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.TestClass* [ getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]
|
||||
// CHECK3-NEXT: invoke void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]])
|
||||
// CHECK3-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]
|
||||
// CHECK3: invoke.cont:
|
||||
// CHECK3-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAYCTOR_CUR]], i64 1
|
||||
// CHECK3-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), i64 2)
|
||||
// CHECK3-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
|
||||
// CHECK3: arrayctor.cont:
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(void (i8*)* @__cxx_global_array_dtor, i8* null, i8* @__dso_handle) #[[ATTR3]]
|
||||
// CHECK3-NEXT: ret void
|
||||
// CHECK3: lpad:
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK3-NEXT: cleanup
|
||||
// CHECK3-NEXT: [[TMP2:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 0
|
||||
// CHECK3-NEXT: store i8* [[TMP2]], i8** [[EXN_SLOT]], align 8
|
||||
// CHECK3-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 1
|
||||
// CHECK3-NEXT: store i32 [[TMP3]], i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK3-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), [[ARRAYCTOR_CUR]]
|
||||
// CHECK3-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]
|
||||
// CHECK3: arraydestroy.body:
|
||||
// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
|
||||
// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
|
||||
// CHECK3-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
|
||||
// CHECK3-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0)
|
||||
// CHECK3-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]
|
||||
// CHECK3: arraydestroy.done1:
|
||||
// CHECK3-NEXT: br label [[EH_RESUME:%.*]]
|
||||
// CHECK3: eh.resume:
|
||||
// CHECK3-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
// CHECK3-NEXT: [[SEL:%.*]] = load i32, i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK3-NEXT: [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[EXN]], 0
|
||||
// CHECK3-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[SEL]], 1
|
||||
// CHECK3-NEXT: resume { i8*, i32 } [[LPAD_VAL2]]
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_array_dtor
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -2341,13 +2353,6 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z3foov
|
||||
// CHECK3-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @_Z8mayThrowv()
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev
|
||||
// CHECK3-SAME: (%class.TestClass* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -2368,6 +2373,13 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z3foov
|
||||
// CHECK3-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @_Z8mayThrowv()
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@main
|
||||
// CHECK3-SAME: () #[[ATTR6:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -2629,7 +2641,7 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: store i8* [[TMP14]], i8** [[TMP12]], align 8
|
||||
// CHECK3-NEXT: [[TMP15:%.*]] = bitcast [1 x i8*]* [[DOTOMP_COPYPRIVATE_CPR_LIST]] to i8*
|
||||
// CHECK3-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COPYPRIVATE_DID_IT]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_copyprivate(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i64 8, i8* [[TMP15]], void (i8*, i8*)* @.omp.copyprivate.copy_func.4, i32 [[TMP16]])
|
||||
// CHECK3-NEXT: call void @__kmpc_copyprivate(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i64 8, i8* [[TMP15]], void (i8*, i8*)* @.omp.copyprivate.copy_func.5, i32 [[TMP16]])
|
||||
// CHECK3-NEXT: ret void
|
||||
// CHECK3: terminate.handler:
|
||||
// CHECK3-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
@ -2656,7 +2668,7 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.4
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.5
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR9]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
@ -2698,11 +2710,11 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to double*
|
||||
// CHECK3-NEXT: store double [[TMP7]], double* [[CONV]], align 8
|
||||
// CHECK3-NEXT: [[TMP8:%.*]] = load i64, i64* [[A_CASTED]], align 8
|
||||
// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SST*, i64)* @.omp_outlined..5 to void (i32*, i32*, ...)*), %struct.SST* [[TMP1]], i64 [[TMP8]])
|
||||
// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SST*, i64)* @.omp_outlined..6 to void (i32*, i32*, ...)*), %struct.SST* [[TMP1]], i64 [[TMP8]])
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..5
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..6
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SST* [[THIS:%.*]], i64 [[A:%.*]]) #[[ATTR12]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2743,11 +2755,11 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: store i8* [[TMP10]], i8** [[TMP8]], align 8
|
||||
// CHECK3-NEXT: [[TMP11:%.*]] = bitcast [1 x i8*]* [[DOTOMP_COPYPRIVATE_CPR_LIST]] to i8*
|
||||
// CHECK3-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COPYPRIVATE_DID_IT]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_copyprivate(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i64 8, i8* [[TMP11]], void (i8*, i8*)* @.omp.copyprivate.copy_func.6, i32 [[TMP12]])
|
||||
// CHECK3-NEXT: call void @__kmpc_copyprivate(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i64 8, i8* [[TMP11]], void (i8*, i8*)* @.omp.copyprivate.copy_func.7, i32 [[TMP12]])
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.6
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.7
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR9]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
@ -2817,11 +2829,11 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: [[CONV10:%.*]] = bitcast i64* [[C_CASTED]] to i32*
|
||||
// CHECK3-NEXT: store i32 [[TMP8]], i32* [[CONV10]], align 4
|
||||
// CHECK3-NEXT: [[TMP9:%.*]] = load i64, i64* [[C_CASTED]], align 8
|
||||
// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*, i64, i64, i64)* @.omp_outlined..7 to void (i32*, i32*, ...)*), %struct.SS* [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]])
|
||||
// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*, i64, i64, i64)* @.omp_outlined..8 to void (i32*, i32*, ...)*), %struct.SS* [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]])
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..7
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..8
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]], i64 [[A:%.*]], i64 [[B:%.*]], i64 [[C:%.*]]) #[[ATTR12]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -2901,7 +2913,7 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: store i8* [[TMP23]], i8** [[TMP21]], align 8
|
||||
// CHECK3-NEXT: [[TMP24:%.*]] = bitcast [3 x i8*]* [[DOTOMP_COPYPRIVATE_CPR_LIST]] to i8*
|
||||
// CHECK3-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COPYPRIVATE_DID_IT]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_copyprivate(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]], i64 24, i8* [[TMP24]], void (i8*, i8*)* @.omp.copyprivate.copy_func.8, i32 [[TMP25]])
|
||||
// CHECK3-NEXT: call void @__kmpc_copyprivate(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]], i64 24, i8* [[TMP24]], void (i8*, i8*)* @.omp.copyprivate.copy_func.9, i32 [[TMP25]])
|
||||
// CHECK3-NEXT: ret void
|
||||
// CHECK3: terminate.handler:
|
||||
// CHECK3-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
@ -2953,11 +2965,11 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: [[CONV3:%.*]] = bitcast i64* [[C_CASTED]] to i32*
|
||||
// CHECK3-NEXT: store i32 [[TMP21]], i32* [[CONV3]], align 4
|
||||
// CHECK3-NEXT: [[TMP22:%.*]] = load i64, i64* [[C_CASTED]], align 8
|
||||
// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*, i64, i64, i64)* @.omp_outlined..9 to void (i32*, i32*, ...)*), %struct.SS* [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]])
|
||||
// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*, i64, i64, i64)* @.omp_outlined..10 to void (i32*, i32*, ...)*), %struct.SS* [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]])
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.8
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.9
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR9]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
@ -2995,7 +3007,7 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..9
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..10
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]], i64 [[A:%.*]], i64 [[B:%.*]], i64 [[C:%.*]]) #[[ATTR12]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3061,11 +3073,11 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-NEXT: store i8* [[TMP19]], i8** [[TMP17]], align 8
|
||||
// CHECK3-NEXT: [[TMP20:%.*]] = bitcast [3 x i8*]* [[DOTOMP_COPYPRIVATE_CPR_LIST]] to i8*
|
||||
// CHECK3-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COPYPRIVATE_DID_IT]], align 4
|
||||
// CHECK3-NEXT: call void @__kmpc_copyprivate(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]], i64 24, i8* [[TMP20]], void (i8*, i8*)* @.omp.copyprivate.copy_func.10, i32 [[TMP21]])
|
||||
// CHECK3-NEXT: call void @__kmpc_copyprivate(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]], i64 24, i8* [[TMP20]], void (i8*, i8*)* @.omp.copyprivate.copy_func.11, i32 [[TMP21]])
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.10
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.11
|
||||
// CHECK3-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR9]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
@ -3106,11 +3118,11 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_Z15parallel_singlev
|
||||
// CHECK3-SAME: () #[[ATTR10]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..11 to void (i32*, i32*, ...)*))
|
||||
// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..12 to void (i32*, i32*, ...)*))
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..11
|
||||
// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..12
|
||||
// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR12]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
@ -3152,7 +3164,9 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK3-SAME: () #[[ATTR0]] {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: call void @__cxx_global_var_init()
|
||||
// CHECK3-NEXT: call void @__cxx_global_var_init.1()
|
||||
// CHECK3-NEXT: call void @__cxx_global_var_init.4()
|
||||
// CHECK3-NEXT: call void @.__omp_threadprivate_init_.()
|
||||
// CHECK3-NEXT: call void @.__omp_threadprivate_init_..3()
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
@ -4151,195 +4165,195 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK5-SAME: () #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG6:![0-9]+]] {
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG6:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) @tc), !dbg [[DBG8:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(void (i8*)* bitcast (void (%class.TestClass*)* @_ZN9TestClassD1Ev to void (i8*)*), i8* bitcast (%class.TestClass* @tc to i8*), i8* @__dso_handle) #[[ATTR3:[0-9]+]], !dbg [[DBG11:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG8]]
|
||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG9:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*, !dbg [[DBG9]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]]), !dbg [[DBG10:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG9]]
|
||||
// CHECK5-NEXT: ret i8* [[TMP3]], !dbg [[DBG9]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev
|
||||
// CHECK5-SAME: (%class.TestClass* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 !dbg [[DBG12:![0-9]+]] {
|
||||
// CHECK5-SAME: (%class.TestClass* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 !dbg [[DBG11:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca %class.TestClass*, align 8
|
||||
// CHECK5-NEXT: store %class.TestClass* [[THIS]], %class.TestClass** [[THIS_ADDR]], align 8
|
||||
// CHECK5-NEXT: [[THIS1:%.*]] = load %class.TestClass*, %class.TestClass** [[THIS_ADDR]], align 8
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassC2Ev(%class.TestClass* nonnull dereferenceable(4) [[THIS1]]), !dbg [[DBG13:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG14:![0-9]+]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev
|
||||
// CHECK5-SAME: (%class.TestClass* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] align 2 !dbg [[DBG15:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca %class.TestClass*, align 8
|
||||
// CHECK5-NEXT: store %class.TestClass* [[THIS]], %class.TestClass** [[THIS_ADDR]], align 8
|
||||
// CHECK5-NEXT: [[THIS1:%.*]] = load %class.TestClass*, %class.TestClass** [[THIS_ADDR]], align 8
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD2Ev(%class.TestClass* nonnull dereferenceable(4) [[THIS1]]) #[[ATTR3]], !dbg [[DBG16:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG17:![0-9]+]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !dbg [[DBG18:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK5-NEXT: br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG19:![0-9]+]]
|
||||
// CHECK5: arrayctor.loop:
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.TestClass* [ getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ], !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: invoke void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]])
|
||||
// CHECK5-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]], !dbg [[DBG19]]
|
||||
// CHECK5: invoke.cont:
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), i64 2), !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG19]]
|
||||
// CHECK5: arrayctor.cont:
|
||||
// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(void (i8*)* @__cxx_global_array_dtor, i8* null, i8* @__dso_handle) #[[ATTR3]], !dbg [[DBG21:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG21]]
|
||||
// CHECK5: lpad:
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK5-NEXT: cleanup, !dbg [[DBG22:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 0, !dbg [[DBG22]]
|
||||
// CHECK5-NEXT: store i8* [[TMP2]], i8** [[EXN_SLOT]], align 8, !dbg [[DBG22]]
|
||||
// CHECK5-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 1, !dbg [[DBG22]]
|
||||
// CHECK5-NEXT: store i32 [[TMP3]], i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG22]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), [[ARRAYCTOR_CUR]], !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG19]]
|
||||
// CHECK5: arraydestroy.body:
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG19]]
|
||||
// CHECK5: arraydestroy.done1:
|
||||
// CHECK5-NEXT: br label [[EH_RESUME:%.*]], !dbg [[DBG19]]
|
||||
// CHECK5: eh.resume:
|
||||
// CHECK5-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8, !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: [[SEL:%.*]] = load i32, i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[EXN]], 0, !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[SEL]], 1, !dbg [[DBG19]]
|
||||
// CHECK5-NEXT: resume { i8*, i32 } [[LPAD_VAL2]], !dbg [[DBG19]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_array_dtor
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG23:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK5-NEXT: br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG24:![0-9]+]]
|
||||
// CHECK5: arraydestroy.body:
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG24]]
|
||||
// CHECK5: arraydestroy.done1:
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG24]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG25:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG26:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*, !dbg [[DBG26]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]]), !dbg [[DBG27:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG26]]
|
||||
// CHECK5-NEXT: ret i8* [[TMP3]], !dbg [[DBG26]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassC2Ev(%class.TestClass* nonnull dereferenceable(4) [[THIS1]]), !dbg [[DBG12:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG13:![0-9]+]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_.
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG28:![0-9]+]] {
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG14:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG29:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*, !dbg [[DBG29]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]]) #[[ATTR3]], !dbg [[DBG29]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG30:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG15:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*, !dbg [[DBG15]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[TMP2]]) #[[ATTR3:[0-9]+]], !dbg [[DBG15]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG16:![0-9]+]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev
|
||||
// CHECK5-SAME: (%class.TestClass* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] align 2 !dbg [[DBG17:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca %class.TestClass*, align 8
|
||||
// CHECK5-NEXT: store %class.TestClass* [[THIS]], %class.TestClass** [[THIS_ADDR]], align 8
|
||||
// CHECK5-NEXT: [[THIS1:%.*]] = load %class.TestClass*, %class.TestClass** [[THIS_ADDR]], align 8
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD2Ev(%class.TestClass* nonnull dereferenceable(4) [[THIS1]]) #[[ATTR3]], !dbg [[DBG18:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG19:![0-9]+]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_.
|
||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG31:![0-9]+]] {
|
||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG20:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]), !dbg [[DBG32:![0-9]+]]
|
||||
// CHECK5-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast (%class.TestClass* @tc to i8*), i8* (i8*)* @.__kmpc_global_ctor_., i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_.), !dbg [[DBG32]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG32]]
|
||||
// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]), !dbg [[DBG21:![0-9]+]]
|
||||
// CHECK5-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB1]], i8* bitcast (%class.TestClass* @tc to i8*), i8* (i8*)* @.__kmpc_global_ctor_., i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_.), !dbg [[DBG21]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG21]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..2
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !dbg [[DBG33:![0-9]+]] {
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..1
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !dbg [[DBG22:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK5-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG34:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to [2 x %class.TestClass]*, !dbg [[DBG34]]
|
||||
// CHECK5-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], [2 x %class.TestClass]* [[TMP2]], i32 0, i32 0, !dbg [[DBG35:![0-9]+]]
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAY_BEGIN]], i64 2, !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG23:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to [2 x %class.TestClass]*, !dbg [[DBG23]]
|
||||
// CHECK5-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], [2 x %class.TestClass]* [[TMP2]], i32 0, i32 0, !dbg [[DBG24:![0-9]+]]
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAY_BEGIN]], i64 2, !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG24]]
|
||||
// CHECK5: arrayctor.loop:
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.TestClass* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.TestClass* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ], !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: invoke void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]])
|
||||
// CHECK5-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]], !dbg [[DBG24]]
|
||||
// CHECK5: invoke.cont:
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]], !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG24]]
|
||||
// CHECK5: arrayctor.cont:
|
||||
// CHECK5-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG34]]
|
||||
// CHECK5-NEXT: ret i8* [[TMP3]], !dbg [[DBG34]]
|
||||
// CHECK5-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG23]]
|
||||
// CHECK5-NEXT: ret i8* [[TMP3]], !dbg [[DBG23]]
|
||||
// CHECK5: lpad:
|
||||
// CHECK5-NEXT: [[TMP4:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK5-NEXT: cleanup, !dbg [[DBG36:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP5:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 0, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: store i8* [[TMP5]], i8** [[EXN_SLOT]], align 8, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: [[TMP6:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 1, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: store i32 [[TMP6]], i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq %class.TestClass* [[ARRAY_BEGIN]], [[ARRAYCTOR_CUR]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: cleanup, !dbg [[DBG25:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP5:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 0, !dbg [[DBG25]]
|
||||
// CHECK5-NEXT: store i8* [[TMP5]], i8** [[EXN_SLOT]], align 8, !dbg [[DBG25]]
|
||||
// CHECK5-NEXT: [[TMP6:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 1, !dbg [[DBG25]]
|
||||
// CHECK5-NEXT: store i32 [[TMP6]], i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG25]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq %class.TestClass* [[ARRAY_BEGIN]], [[ARRAYCTOR_CUR]], !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG24]]
|
||||
// CHECK5: arraydestroy.body:
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]], !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG24]]
|
||||
// CHECK5: arraydestroy.done1:
|
||||
// CHECK5-NEXT: br label [[EH_RESUME:%.*]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: br label [[EH_RESUME:%.*]], !dbg [[DBG24]]
|
||||
// CHECK5: eh.resume:
|
||||
// CHECK5-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8, !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[SEL:%.*]] = load i32, i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[EXN]], 0, !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[SEL]], 1, !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: resume { i8*, i32 } [[LPAD_VAL2]], !dbg [[DBG35]]
|
||||
// CHECK5-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8, !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: [[SEL:%.*]] = load i32, i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[EXN]], 0, !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[SEL]], 1, !dbg [[DBG24]]
|
||||
// CHECK5-NEXT: resume { i8*, i32 } [[LPAD_VAL2]], !dbg [[DBG24]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..3
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG37:![0-9]+]] {
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..2
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG26:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG38:![0-9]+]]
|
||||
// CHECK5-NEXT: [[ARRAY_BEGIN:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*, !dbg [[DBG38]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAY_BEGIN]], i64 2, !dbg [[DBG38]]
|
||||
// CHECK5-NEXT: br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG38]]
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !dbg [[DBG27:![0-9]+]]
|
||||
// CHECK5-NEXT: [[ARRAY_BEGIN:%.*]] = bitcast i8* [[TMP1]] to %class.TestClass*, !dbg [[DBG27]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAY_BEGIN]], i64 2, !dbg [[DBG27]]
|
||||
// CHECK5-NEXT: br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG27]]
|
||||
// CHECK5: arraydestroy.body:
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[TMP2]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG38]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG38]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG38]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]], !dbg [[DBG38]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG38]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[TMP2]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG27]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG27]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG27]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]], !dbg [[DBG27]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG27]]
|
||||
// CHECK5: arraydestroy.done1:
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG39:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG28:![0-9]+]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_..4
|
||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG40:![0-9]+]] {
|
||||
// CHECK5-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_..3
|
||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG29:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]]), !dbg [[DBG41:![0-9]+]]
|
||||
// CHECK5-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB3]], i8* bitcast ([2 x %class.TestClass]* @tc2 to i8*), i8* (i8*)* @.__kmpc_global_ctor_..2, i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_..3), !dbg [[DBG41]]
|
||||
// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]]), !dbg [[DBG30:![0-9]+]]
|
||||
// CHECK5-NEXT: call void @__kmpc_threadprivate_register(%struct.ident_t* @[[GLOB3]], i8* bitcast ([2 x %class.TestClass]* @tc2 to i8*), i8* (i8*)* @.__kmpc_global_ctor_..1, i8* (i8*, i8*)* null, void (i8*)* @.__kmpc_global_dtor_..2), !dbg [[DBG30]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG30]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG31:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) @tc), !dbg [[DBG32:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(void (i8*)* bitcast (void (%class.TestClass*)* @_ZN9TestClassD1Ev to void (i8*)*), i8* bitcast (%class.TestClass* @tc to i8*), i8* @__dso_handle) #[[ATTR3]], !dbg [[DBG34:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG32]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
|
||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !dbg [[DBG35:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK5-NEXT: br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG36:![0-9]+]]
|
||||
// CHECK5: arrayctor.loop:
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.TestClass* [ getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ], !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: invoke void @_ZN9TestClassC1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]])
|
||||
// CHECK5-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]], !dbg [[DBG36]]
|
||||
// CHECK5: invoke.cont:
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], %class.TestClass* [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), i64 2), !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG36]]
|
||||
// CHECK5: arrayctor.cont:
|
||||
// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(void (i8*)* @__cxx_global_array_dtor, i8* null, i8* @__dso_handle) #[[ATTR3]], !dbg [[DBG38:![0-9]+]]
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG38]]
|
||||
// CHECK5: lpad:
|
||||
// CHECK5-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK5-NEXT: cleanup, !dbg [[DBG39:![0-9]+]]
|
||||
// CHECK5-NEXT: [[TMP2:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 0, !dbg [[DBG39]]
|
||||
// CHECK5-NEXT: store i8* [[TMP2]], i8** [[EXN_SLOT]], align 8, !dbg [[DBG39]]
|
||||
// CHECK5-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 1, !dbg [[DBG39]]
|
||||
// CHECK5-NEXT: store i32 [[TMP3]], i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG39]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), [[ARRAYCTOR_CUR]], !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG36]]
|
||||
// CHECK5: arraydestroy.body:
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG36]]
|
||||
// CHECK5: arraydestroy.done1:
|
||||
// CHECK5-NEXT: br label [[EH_RESUME:%.*]], !dbg [[DBG36]]
|
||||
// CHECK5: eh.resume:
|
||||
// CHECK5-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: [[SEL:%.*]] = load i32, i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[EXN]], 0, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[SEL]], 1, !dbg [[DBG36]]
|
||||
// CHECK5-NEXT: resume { i8*, i32 } [[LPAD_VAL2]], !dbg [[DBG36]]
|
||||
//
|
||||
//
|
||||
// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_array_dtor
|
||||
// CHECK5-SAME: (i8* [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG40:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
|
||||
// CHECK5-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
|
||||
// CHECK5-NEXT: br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG41:![0-9]+]]
|
||||
// CHECK5: arraydestroy.body:
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %class.TestClass* [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], %class.TestClass* getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG41]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], %class.TestClass* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG41]]
|
||||
// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(%class.TestClass* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG41]]
|
||||
// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %class.TestClass* [[ARRAYDESTROY_ELEMENT]], getelementptr inbounds ([2 x %class.TestClass], [2 x %class.TestClass]* @tc2, i32 0, i32 0), !dbg [[DBG41]]
|
||||
// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG41]]
|
||||
// CHECK5: arraydestroy.done1:
|
||||
// CHECK5-NEXT: ret void, !dbg [[DBG41]]
|
||||
//
|
||||
//
|
||||
@ -5154,9 +5168,9 @@ void array_func(int n, int a[n], St s[2]) {
|
||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG186:![0-9]+]] {
|
||||
// CHECK5-NEXT: entry:
|
||||
// CHECK5-NEXT: call void @__cxx_global_var_init(), !dbg [[DBG187:![0-9]+]]
|
||||
// CHECK5-NEXT: call void @__cxx_global_var_init.1(), !dbg [[DBG187]]
|
||||
// CHECK5-NEXT: call void @__cxx_global_var_init.4(), !dbg [[DBG187]]
|
||||
// CHECK5-NEXT: call void @.__omp_threadprivate_init_.(), !dbg [[DBG187]]
|
||||
// CHECK5-NEXT: call void @.__omp_threadprivate_init_..4(), !dbg [[DBG187]]
|
||||
// CHECK5-NEXT: call void @.__omp_threadprivate_init_..3(), !dbg [[DBG187]]
|
||||
// CHECK5-NEXT: ret void
|
||||
//
|
||||
//
|
||||
|
@ -161,6 +161,28 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK1-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -199,6 +221,23 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK1-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -567,45 +606,6 @@ int main() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK1-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK1-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_firstprivate_codegen.cpp
|
||||
// CHECK1-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK1-NEXT: entry:
|
||||
@ -643,6 +643,28 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK2-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -681,6 +703,23 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK2-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK2-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -1049,45 +1088,6 @@ int main() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK2-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK2-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK2-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK2-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_firstprivate_codegen.cpp
|
||||
// CHECK2-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK2-NEXT: entry:
|
||||
@ -1125,6 +1125,28 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK3-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1163,6 +1185,23 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK3-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK3-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1220,45 +1259,6 @@ int main() {
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK3-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK3-NEXT: entry:
|
||||
// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK3-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK3-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK3-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK3-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK3-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK3-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_firstprivate_codegen.cpp
|
||||
// CHECK3-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK3-NEXT: entry:
|
||||
@ -1296,6 +1296,28 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK4-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
@ -1334,6 +1356,23 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK4-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK4-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
@ -1453,45 +1492,6 @@ int main() {
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to float
|
||||
// CHECK4-NEXT: store float [[CONV]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef
|
||||
// CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], float [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {
|
||||
// CHECK4-NEXT: entry:
|
||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
|
||||
// CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: store float [[A]], float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8
|
||||
// CHECK4-NEXT: [[F:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0
|
||||
// CHECK4-NEXT: [[TMP0:%.*]] = load float, float* [[A_ADDR]], align 4
|
||||
// CHECK4-NEXT: [[TMP1:%.*]] = load volatile i32, i32* @g, align 4
|
||||
// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to float
|
||||
// CHECK4-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[CONV]]
|
||||
// CHECK4-NEXT: store float [[ADD]], float* [[F]], align 4
|
||||
// CHECK4-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK4-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_firstprivate_codegen.cpp
|
||||
// CHECK4-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" {
|
||||
// CHECK4-NEXT: entry:
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,62 +1,294 @@
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
|
||||
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK1
|
||||
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
|
||||
// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK2
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=DEBUG1
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
|
||||
// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
|
||||
// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
|
||||
// RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
|
||||
// expected-no-diagnostics
|
||||
#ifndef HEADER
|
||||
#define HEADER
|
||||
|
||||
// CHECK: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, i8* }
|
||||
|
||||
// CHECK: define {{.*}}void [[FOO:@.+]]()
|
||||
|
||||
void foo() { extern void mayThrow(); mayThrow(); }
|
||||
|
||||
// CHECK-LABEL: @main
|
||||
// TERM_DEBUG-LABEL: @main
|
||||
int main() {
|
||||
// CHECK: [[A_ADDR:%.+]] = alloca i8
|
||||
char a;
|
||||
|
||||
// CHECK: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
|
||||
// CHECK: call {{.*}}void @__kmpc_taskgroup([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
|
||||
// CHECK-NEXT: store i8 2, i8* [[A_ADDR]]
|
||||
// CHECK-NEXT: call {{.*}}void @__kmpc_end_taskgroup([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
|
||||
#pragma omp taskgroup
|
||||
a = 2;
|
||||
// CHECK: call {{.*}}void @__kmpc_taskgroup([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
|
||||
// CHECK-NEXT: invoke {{.*}}void [[FOO]]()
|
||||
// CHECK: call {{.*}}void @__kmpc_end_taskgroup([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
|
||||
#pragma omp taskgroup
|
||||
foo();
|
||||
// CHECK-NOT: call {{.*}}void @__kmpc_taskgroup
|
||||
// CHECK-NOT: call {{.*}}void @__kmpc_end_taskgroup
|
||||
// CHECK: ret
|
||||
return a;
|
||||
}
|
||||
|
||||
// CHECK-LABEL: parallel_taskgroup
|
||||
// TERM_DEBUG-LABEL: parallel_taskgroup
|
||||
void parallel_taskgroup() {
|
||||
#pragma omp parallel
|
||||
#pragma omp taskgroup
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_taskgroup({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_end_taskgroup({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]
|
||||
// TERM_DEBUG: [[TERM_LPAD]]
|
||||
// TERM_DEBUG: call void @__clang_call_terminate
|
||||
// TERM_DEBUG: unreachable
|
||||
foo();
|
||||
}
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_START]] = !DILocation(line: [[@LINE-12]],
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_END]] = !DILocation(line: [[@LINE-3]],
|
||||
#endif
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_Z3foov
|
||||
// CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: call void @_Z8mayThrowv()
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@main
|
||||
// CHECK1-SAME: () #[[ATTR2:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[A:%.*]] = alloca i8, align 1
|
||||
// CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK1-NEXT: store i32 0, i32* [[RETVAL]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: store i8 2, i8* [[A]], align 1
|
||||
// CHECK1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: invoke void @_Z3foov()
|
||||
// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
|
||||
// CHECK1: invoke.cont:
|
||||
// CHECK1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i8, i8* [[A]], align 1
|
||||
// CHECK1-NEXT: [[CONV:%.*]] = sext i8 [[TMP1]] to i32
|
||||
// CHECK1-NEXT: ret i32 [[CONV]]
|
||||
// CHECK1: lpad:
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK1-NEXT: catch i8* null
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 0
|
||||
// CHECK1-NEXT: store i8* [[TMP3]], i8** [[EXN_SLOT]], align 8
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 1
|
||||
// CHECK1-NEXT: store i32 [[TMP4]], i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK1-NEXT: br label [[TERMINATE_HANDLER:%.*]]
|
||||
// CHECK1: terminate.handler:
|
||||
// CHECK1-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
// CHECK1-NEXT: call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR8:[0-9]+]]
|
||||
// CHECK1-NEXT: unreachable
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@__clang_call_terminate
|
||||
// CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5:[0-9]+]] comdat {
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR3:[0-9]+]]
|
||||
// CHECK1-NEXT: call void @_ZSt9terminatev() #[[ATTR8]]
|
||||
// CHECK1-NEXT: unreachable
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@_Z18parallel_taskgroupv
|
||||
// CHECK1-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR7:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK1-NEXT: entry:
|
||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
|
||||
// CHECK1-NEXT: invoke void @_Z3foov()
|
||||
// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
|
||||
// CHECK1: invoke.cont:
|
||||
// CHECK1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
|
||||
// CHECK1-NEXT: ret void
|
||||
// CHECK1: lpad:
|
||||
// CHECK1-NEXT: [[TMP2:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK1-NEXT: catch i8* null
|
||||
// CHECK1-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 0
|
||||
// CHECK1-NEXT: store i8* [[TMP3]], i8** [[EXN_SLOT]], align 8
|
||||
// CHECK1-NEXT: [[TMP4:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 1
|
||||
// CHECK1-NEXT: store i32 [[TMP4]], i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
|
||||
// CHECK1-NEXT: br label [[TERMINATE_HANDLER:%.*]]
|
||||
// CHECK1: terminate.handler:
|
||||
// CHECK1-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
// CHECK1-NEXT: call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR8]]
|
||||
// CHECK1-NEXT: unreachable
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_Z3foov
|
||||
// CHECK2-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void @_Z8mayThrowv()
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@main
|
||||
// CHECK2-SAME: () #[[ATTR2:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[A:%.*]] = alloca i8, align 1
|
||||
// CHECK2-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK2-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// CHECK2-NEXT: store i32 0, i32* [[RETVAL]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: store i8 2, i8* [[A]], align 1
|
||||
// CHECK2-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: invoke void @_Z3foov()
|
||||
// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
|
||||
// CHECK2: invoke.cont:
|
||||
// CHECK2-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load i8, i8* [[A]], align 1
|
||||
// CHECK2-NEXT: [[CONV:%.*]] = sext i8 [[TMP1]] to i32
|
||||
// CHECK2-NEXT: ret i32 [[CONV]]
|
||||
// CHECK2: lpad:
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK2-NEXT: catch i8* null
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 0
|
||||
// CHECK2-NEXT: store i8* [[TMP3]], i8** [[EXN_SLOT]], align 8
|
||||
// CHECK2-NEXT: [[TMP4:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 1
|
||||
// CHECK2-NEXT: store i32 [[TMP4]], i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]])
|
||||
// CHECK2-NEXT: br label [[TERMINATE_HANDLER:%.*]]
|
||||
// CHECK2: terminate.handler:
|
||||
// CHECK2-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
// CHECK2-NEXT: call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR8:[0-9]+]]
|
||||
// CHECK2-NEXT: unreachable
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__clang_call_terminate
|
||||
// CHECK2-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5:[0-9]+]] comdat {
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR3:[0-9]+]]
|
||||
// CHECK2-NEXT: call void @_ZSt9terminatev() #[[ATTR8]]
|
||||
// CHECK2-NEXT: unreachable
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_Z18parallel_taskgroupv
|
||||
// CHECK2-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR7:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// CHECK2-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// CHECK2-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
|
||||
// CHECK2-NEXT: invoke void @_Z3foov()
|
||||
// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
|
||||
// CHECK2: invoke.cont:
|
||||
// CHECK2-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
|
||||
// CHECK2-NEXT: ret void
|
||||
// CHECK2: lpad:
|
||||
// CHECK2-NEXT: [[TMP2:%.*]] = landingpad { i8*, i32 }
|
||||
// CHECK2-NEXT: catch i8* null
|
||||
// CHECK2-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 0
|
||||
// CHECK2-NEXT: store i8* [[TMP3]], i8** [[EXN_SLOT]], align 8
|
||||
// CHECK2-NEXT: [[TMP4:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 1
|
||||
// CHECK2-NEXT: store i32 [[TMP4]], i32* [[EHSELECTOR_SLOT]], align 4
|
||||
// CHECK2-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
|
||||
// CHECK2-NEXT: br label [[TERMINATE_HANDLER:%.*]]
|
||||
// CHECK2: terminate.handler:
|
||||
// CHECK2-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
|
||||
// CHECK2-NEXT: call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR8]]
|
||||
// CHECK2-NEXT: unreachable
|
||||
//
|
||||
//
|
||||
// DEBUG1-LABEL: define {{[^@]+}}@_Z3foov
|
||||
// DEBUG1-SAME: () #[[ATTR0:[0-9]+]] !dbg [[DBG6:![0-9]+]] {
|
||||
// DEBUG1-NEXT: entry:
|
||||
// DEBUG1-NEXT: call void @_Z8mayThrowv(), !dbg [[DBG9:![0-9]+]]
|
||||
// DEBUG1-NEXT: ret void, !dbg [[DBG10:![0-9]+]]
|
||||
//
|
||||
//
|
||||
// DEBUG1-LABEL: define {{[^@]+}}@main
|
||||
// DEBUG1-SAME: () #[[ATTR2:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !dbg [[DBG11:![0-9]+]] {
|
||||
// DEBUG1-NEXT: entry:
|
||||
// DEBUG1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// DEBUG1-NEXT: [[A:%.*]] = alloca i8, align 1
|
||||
// DEBUG1-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// DEBUG1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// DEBUG1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
|
||||
// DEBUG1-NEXT: store i32 0, i32* [[RETVAL]], align 4
|
||||
// DEBUG1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]), !dbg [[DBG12:![0-9]+]]
|
||||
// DEBUG1-NEXT: store i8 2, i8* [[A]], align 1, !dbg [[DBG13:![0-9]+]]
|
||||
// DEBUG1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]), !dbg [[DBG14:![0-9]+]]
|
||||
// DEBUG1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG15:![0-9]+]]
|
||||
// DEBUG1-NEXT: invoke void @_Z3foov()
|
||||
// DEBUG1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]], !dbg [[DBG16:![0-9]+]]
|
||||
// DEBUG1: invoke.cont:
|
||||
// DEBUG1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]), !dbg [[DBG16]]
|
||||
// DEBUG1-NEXT: [[TMP1:%.*]] = load i8, i8* [[A]], align 1, !dbg [[DBG17:![0-9]+]]
|
||||
// DEBUG1-NEXT: [[CONV:%.*]] = sext i8 [[TMP1]] to i32, !dbg [[DBG17]]
|
||||
// DEBUG1-NEXT: ret i32 [[CONV]], !dbg [[DBG18:![0-9]+]]
|
||||
// DEBUG1: lpad:
|
||||
// DEBUG1-NEXT: [[TMP2:%.*]] = landingpad { i8*, i32 }
|
||||
// DEBUG1-NEXT: catch i8* null, !dbg [[DBG19:![0-9]+]]
|
||||
// DEBUG1-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 0, !dbg [[DBG19]]
|
||||
// DEBUG1-NEXT: store i8* [[TMP3]], i8** [[EXN_SLOT]], align 8, !dbg [[DBG19]]
|
||||
// DEBUG1-NEXT: [[TMP4:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 1, !dbg [[DBG19]]
|
||||
// DEBUG1-NEXT: store i32 [[TMP4]], i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG19]]
|
||||
// DEBUG1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]), !dbg [[DBG16]]
|
||||
// DEBUG1-NEXT: br label [[TERMINATE_HANDLER:%.*]], !dbg [[DBG16]]
|
||||
// DEBUG1: terminate.handler:
|
||||
// DEBUG1-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8, !dbg [[DBG16]]
|
||||
// DEBUG1-NEXT: call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR8:[0-9]+]], !dbg [[DBG16]]
|
||||
// DEBUG1-NEXT: unreachable, !dbg [[DBG16]]
|
||||
//
|
||||
//
|
||||
// DEBUG1-LABEL: define {{[^@]+}}@__clang_call_terminate
|
||||
// DEBUG1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5:[0-9]+]] {
|
||||
// DEBUG1-NEXT: [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR3:[0-9]+]]
|
||||
// DEBUG1-NEXT: call void @_ZSt9terminatev() #[[ATTR8]]
|
||||
// DEBUG1-NEXT: unreachable
|
||||
//
|
||||
//
|
||||
// DEBUG1-LABEL: define {{[^@]+}}@_Z18parallel_taskgroupv
|
||||
// DEBUG1-SAME: () #[[ATTR6:[0-9]+]] !dbg [[DBG20:![0-9]+]] {
|
||||
// DEBUG1-NEXT: entry:
|
||||
// DEBUG1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB7:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*)), !dbg [[DBG21:![0-9]+]]
|
||||
// DEBUG1-NEXT: ret void, !dbg [[DBG22:![0-9]+]]
|
||||
//
|
||||
//
|
||||
// DEBUG1-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
// DEBUG1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR7:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !dbg [[DBG23:![0-9]+]] {
|
||||
// DEBUG1-NEXT: entry:
|
||||
// DEBUG1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// DEBUG1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
|
||||
// DEBUG1-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
|
||||
// DEBUG1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
|
||||
// DEBUG1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
|
||||
// DEBUG1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
|
||||
// DEBUG1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG24:![0-9]+]]
|
||||
// DEBUG1-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4, !dbg [[DBG24]]
|
||||
// DEBUG1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB5:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG24]]
|
||||
// DEBUG1-NEXT: invoke void @_Z3foov()
|
||||
// DEBUG1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]], !dbg [[DBG25:![0-9]+]]
|
||||
// DEBUG1: invoke.cont:
|
||||
// DEBUG1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB5]], i32 [[TMP1]]), !dbg [[DBG25]]
|
||||
// DEBUG1-NEXT: ret void, !dbg [[DBG26:![0-9]+]]
|
||||
// DEBUG1: lpad:
|
||||
// DEBUG1-NEXT: [[TMP2:%.*]] = landingpad { i8*, i32 }
|
||||
// DEBUG1-NEXT: catch i8* null, !dbg [[DBG27:![0-9]+]]
|
||||
// DEBUG1-NEXT: [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 0, !dbg [[DBG27]]
|
||||
// DEBUG1-NEXT: store i8* [[TMP3]], i8** [[EXN_SLOT]], align 8, !dbg [[DBG27]]
|
||||
// DEBUG1-NEXT: [[TMP4:%.*]] = extractvalue { i8*, i32 } [[TMP2]], 1, !dbg [[DBG27]]
|
||||
// DEBUG1-NEXT: store i32 [[TMP4]], i32* [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG27]]
|
||||
// DEBUG1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB5]], i32 [[TMP1]]), !dbg [[DBG25]]
|
||||
// DEBUG1-NEXT: br label [[TERMINATE_HANDLER:%.*]], !dbg [[DBG25]]
|
||||
// DEBUG1: terminate.handler:
|
||||
// DEBUG1-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8, !dbg [[DBG25]]
|
||||
// DEBUG1-NEXT: call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR8]], !dbg [[DBG25]]
|
||||
// DEBUG1-NEXT: unreachable, !dbg [[DBG25]]
|
||||
//
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1078,21 +1078,15 @@ extern "C" void tfoo7() {
|
||||
// CHECK1-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@body
|
||||
// CHECK2-SAME: (...) #[[ATTR0:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init
|
||||
// CHECK2-SAME: () #[[ATTR1:[0-9]+]] section ".text.startup" {
|
||||
// CHECK2-SAME: () #[[ATTR0:[0-9]+]] section ".text.startup" {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void @_ZN1SC1Ev(%struct.S* nonnull dereferenceable(4) @s)
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SC1Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 {
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8
|
||||
@ -1102,7 +1096,7 @@ extern "C" void tfoo7() {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN1SC2Ev
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
|
||||
// CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8
|
||||
// CHECK2-NEXT: [[I:%.*]] = alloca i32*, align 8
|
||||
@ -1164,8 +1158,14 @@ extern "C" void tfoo7() {
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@body
|
||||
// CHECK2-SAME: (...) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@foo1
|
||||
// CHECK2-SAME: (i32 [[START:%.*]], i32 [[END:%.*]], i32 [[STEP:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-SAME: (i32 [[START:%.*]], i32 [[END:%.*]], i32 [[STEP:%.*]]) #[[ATTR2]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[START_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[END_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -1255,7 +1255,7 @@ extern "C" void tfoo7() {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@foo2
|
||||
// CHECK2-SAME: (i32 [[START:%.*]], i32 [[END:%.*]], i32 [[STEP:%.*]]) #[[ATTR0]] {
|
||||
// CHECK2-SAME: (i32 [[START:%.*]], i32 [[END:%.*]], i32 [[STEP:%.*]]) #[[ATTR2]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[START_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[END_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -1368,7 +1368,7 @@ extern "C" void tfoo7() {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@foo3
|
||||
// CHECK2-SAME: () #[[ATTR0]] {
|
||||
// CHECK2-SAME: () #[[ATTR2]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
||||
@ -1510,7 +1510,7 @@ extern "C" void tfoo7() {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@foo4
|
||||
// CHECK2-SAME: () #[[ATTR0]] {
|
||||
// CHECK2-SAME: () #[[ATTR2]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
||||
@ -1663,7 +1663,7 @@ extern "C" void tfoo7() {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@foo5
|
||||
// CHECK2-SAME: () #[[ATTR0]] {
|
||||
// CHECK2-SAME: () #[[ATTR2]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i64, align 8
|
||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
||||
@ -1872,7 +1872,7 @@ extern "C" void tfoo7() {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@foo6
|
||||
// CHECK2-SAME: () #[[ATTR0]] {
|
||||
// CHECK2-SAME: () #[[ATTR2]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
|
||||
// CHECK2-NEXT: ret void
|
||||
@ -1975,14 +1975,14 @@ extern "C" void tfoo7() {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@tfoo7
|
||||
// CHECK2-SAME: () #[[ATTR0]] {
|
||||
// CHECK2-SAME: () #[[ATTR2]] {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void @_Z4foo7IiLi3ELi5EEvT_S0_(i32 0, i32 42)
|
||||
// CHECK2-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_Z4foo7IiLi3ELi5EEvT_S0_
|
||||
// CHECK2-SAME: (i32 [[START:%.*]], i32 [[END:%.*]]) #[[ATTR0]] comdat {
|
||||
// CHECK2-SAME: (i32 [[START:%.*]], i32 [[END:%.*]]) #[[ATTR2]] comdat {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: [[START_ADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK2-NEXT: [[END_ADDR:%.*]] = alloca i32, align 4
|
||||
@ -2066,7 +2066,7 @@ extern "C" void tfoo7() {
|
||||
//
|
||||
//
|
||||
// CHECK2-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_tile_codegen.cpp
|
||||
// CHECK2-SAME: () #[[ATTR1]] section ".text.startup" {
|
||||
// CHECK2-SAME: () #[[ATTR0]] section ".text.startup" {
|
||||
// CHECK2-NEXT: entry:
|
||||
// CHECK2-NEXT: call void @__cxx_global_var_init()
|
||||
// CHECK2-NEXT: ret void
|
||||
|
@ -30,12 +30,15 @@ void foo(void) {
|
||||
A[i] = 1.0;
|
||||
}
|
||||
}
|
||||
// OMP-LABEL: @foo(
|
||||
// OMP-LABEL: @main(
|
||||
// OMP-NEXT: entry:
|
||||
// OMP-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
||||
// OMP-NEXT: store i32 0, i32* [[RETVAL]], align 4
|
||||
// OMP-NEXT: store i32 0, i32* [[I]], align 4
|
||||
// OMP-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
|
||||
// OMP-NEXT: ret void
|
||||
// OMP-NEXT: call void @foo()
|
||||
// OMP-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// OMP-LABEL: @.omp_outlined.(
|
||||
@ -85,7 +88,7 @@ void foo(void) {
|
||||
// OMP-NEXT: [[TMP8:%.*]] = load i32, i32* [[I]], align 4
|
||||
// OMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP8]] to i64
|
||||
// OMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], [33554432 x double]* @A, i64 0, i64 [[IDXPROM]]
|
||||
// OMP-NEXT: store double 1.000000e+00, double* [[ARRAYIDX]], align 8
|
||||
// OMP-NEXT: store double 0.000000e+00, double* [[ARRAYIDX]], align 8
|
||||
// OMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
||||
// OMP: omp.body.continue:
|
||||
// OMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
||||
@ -101,15 +104,12 @@ void foo(void) {
|
||||
// OMP-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// OMP-LABEL: @main(
|
||||
// OMP-LABEL: @foo(
|
||||
// OMP-NEXT: entry:
|
||||
// OMP-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
||||
// OMP-NEXT: store i32 0, i32* [[RETVAL]], align 4
|
||||
// OMP-NEXT: store i32 0, i32* [[I]], align 4
|
||||
// OMP-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
|
||||
// OMP-NEXT: call void @foo()
|
||||
// OMP-NEXT: ret i32 0
|
||||
// OMP-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// OMP-LABEL: @.omp_outlined..1(
|
||||
@ -159,7 +159,7 @@ void foo(void) {
|
||||
// OMP-NEXT: [[TMP8:%.*]] = load i32, i32* [[I]], align 4
|
||||
// OMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP8]] to i64
|
||||
// OMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], [33554432 x double]* @A, i64 0, i64 [[IDXPROM]]
|
||||
// OMP-NEXT: store double 0.000000e+00, double* [[ARRAYIDX]], align 8
|
||||
// OMP-NEXT: store double 1.000000e+00, double* [[ARRAYIDX]], align 8
|
||||
// OMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
||||
// OMP: omp.body.continue:
|
||||
// OMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
||||
|
@ -15,7 +15,7 @@ void foo(void);
|
||||
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
||||
// OMP-NEXT: store i32 0, i32* [[RETVAL]], align 4
|
||||
// OMP-NEXT: store i32 0, i32* [[I]], align 4
|
||||
// OMP-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
|
||||
// OMP-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
|
||||
// OMP-NEXT: call void @foo()
|
||||
// OMP-NEXT: ret i32 0
|
||||
//
|
||||
@ -63,7 +63,7 @@ int main() {
|
||||
// OMP-NEXT: entry:
|
||||
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
||||
// OMP-NEXT: store i32 0, i32* [[I]], align 4
|
||||
// OMP-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
|
||||
// OMP-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
|
||||
// OMP-NEXT: ret void
|
||||
//
|
||||
// NOOMP-LABEL: @foo(
|
||||
|
@ -922,6 +922,13 @@ def OMP_Distribute : Directive<"distribute"> {
|
||||
VersionedClause<OMPC_DistSchedule>
|
||||
];
|
||||
}
|
||||
def OMP_BeginDeclareTarget : Directive<"begin declare target"> {
|
||||
let allowedClauses = [
|
||||
VersionedClause<OMPC_To>,
|
||||
VersionedClause<OMPC_Link>,
|
||||
VersionedClause<OMPC_DeviceType>,
|
||||
];
|
||||
}
|
||||
def OMP_DeclareTarget : Directive<"declare target"> {
|
||||
let allowedClauses = [
|
||||
VersionedClause<OMPC_To>,
|
||||
|
Loading…
x
Reference in New Issue
Block a user