mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-26 15:11:00 +00:00
Generate alias metadata even in OpenMP mode
To make alias scope metadata generation work in OpenMP mode we now provide the ScopAnnotator with information about the base pointer rewrite that happens when passing arrays into the OpenMP subfunction. llvm-svn: 245451
This commit is contained in:
parent
3b0fd753c4
commit
b0da42fb55
@ -17,6 +17,7 @@
|
||||
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/ValueMap.h"
|
||||
|
||||
namespace llvm {
|
||||
class ScalarEvolution;
|
||||
@ -59,6 +60,25 @@ public:
|
||||
void annotateLoopLatch(llvm::BranchInst *B, llvm::Loop *L,
|
||||
bool IsParallel) const;
|
||||
|
||||
/// @brief Add alternative alias based pointers
|
||||
///
|
||||
/// When annotating instructions with alias scope metadata, the right metadata
|
||||
/// is identified through the base pointer of the memory access. In some cases
|
||||
/// (e.g. OpenMP code generation), the base pointer of the memory accesses is
|
||||
/// not the original base pointer, but was changed when passing the original
|
||||
/// base pointer over a function boundary. This function allows to provide a
|
||||
/// map that maps from these new base pointers to the original base pointers
|
||||
/// to allow the ScopAnnotator to still find the right alias scop annotations.
|
||||
///
|
||||
/// @param NewMap A map from new base pointers to original base pointers.
|
||||
void addAlternativeAliasBases(
|
||||
llvm::ValueMap<llvm::Value *, llvm::Value *> &NewMap) {
|
||||
AlternativeAliasBases.insert(NewMap.begin(), NewMap.end());
|
||||
}
|
||||
|
||||
/// @brief Delete the set of alternative alias bases
|
||||
void resetAlternativeAliasBases() { AlternativeAliasBases.clear(); }
|
||||
|
||||
private:
|
||||
/// @brief The ScalarEvolution analysis we use to find base pointers.
|
||||
llvm::ScalarEvolution *SE;
|
||||
@ -77,6 +97,8 @@ private:
|
||||
|
||||
/// @brief A map from base pointers to an alias scope list of other pointers.
|
||||
llvm::DenseMap<llvm::Value *, llvm::MDNode *> OtherAliasScopeListMap;
|
||||
|
||||
llvm::ValueMap<llvm::Value *, llvm::Value *> AlternativeAliasBases;
|
||||
};
|
||||
|
||||
/// @brief Add Polly specifics when running IRBuilder.
|
||||
|
@ -135,8 +135,16 @@ void ScopAnnotator::annotate(Instruction *Inst) {
|
||||
}
|
||||
|
||||
if (BasePtr) {
|
||||
Inst->setMetadata("alias.scope", AliasScopeMap[BasePtr]);
|
||||
Inst->setMetadata("noalias", OtherAliasScopeListMap[BasePtr]);
|
||||
auto *AliasScope = AliasScopeMap[BasePtr];
|
||||
|
||||
if (!AliasScope)
|
||||
BasePtr = AlternativeAliasBases[BasePtr];
|
||||
|
||||
AliasScope = AliasScopeMap[BasePtr];
|
||||
auto *OtherAliasScopeList = OtherAliasScopeListMap[BasePtr];
|
||||
|
||||
Inst->setMetadata("alias.scope", AliasScope);
|
||||
Inst->setMetadata("noalias", OtherAliasScopeList);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -519,8 +519,16 @@ void IslNodeBuilder::createForParallel(__isl_take isl_ast_node *For) {
|
||||
updateValues(NewValues);
|
||||
IDToValue[IteratorID] = IV;
|
||||
|
||||
ParallelLoopGenerator::ValueToValueMapTy NewValuesReverse;
|
||||
|
||||
for (auto P : NewValues)
|
||||
NewValuesReverse[P.second] = P.first;
|
||||
|
||||
Annotator.addAlternativeAliasBases(NewValuesReverse);
|
||||
|
||||
create(Body);
|
||||
|
||||
Annotator.resetAlternativeAliasBases();
|
||||
// Restore the original values.
|
||||
ValueMap = ValueMapCopy;
|
||||
IDToValue = IDToValueCopy;
|
||||
|
52
polly/test/Isl/CodeGen/OpenMP/alias-metadata.ll
Normal file
52
polly/test/Isl/CodeGen/OpenMP/alias-metadata.ll
Normal file
@ -0,0 +1,52 @@
|
||||
; RUN: opt %loadPolly -polly-codegen -polly-parallel -S < %s | FileCheck %s
|
||||
;
|
||||
; void foo(float *A, float *B) {
|
||||
; for (long i = 0; i < 1000; i++)
|
||||
; for (long j = 0; j < 1000; j++)
|
||||
; A[i] = B[i];
|
||||
; }
|
||||
;
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
; CHECK: define internal void @foo.polly.subfn
|
||||
|
||||
define void @foo(float* %A, float* %B) {
|
||||
bb:
|
||||
br label %bb2
|
||||
|
||||
bb2: ; preds = %bb11, %bb
|
||||
%i.0 = phi i64 [ 0, %bb ], [ %tmp12, %bb11 ]
|
||||
%exitcond1 = icmp ne i64 %i.0, 1000
|
||||
br i1 %exitcond1, label %bb3, label %bb13
|
||||
|
||||
bb3: ; preds = %bb2
|
||||
br label %bb4
|
||||
|
||||
bb4: ; preds = %bb8, %bb3
|
||||
%j.0 = phi i64 [ 0, %bb3 ], [ %tmp9, %bb8 ]
|
||||
%exitcond = icmp ne i64 %j.0, 1000
|
||||
br i1 %exitcond, label %bb5, label %bb10
|
||||
|
||||
bb5: ; preds = %bb4
|
||||
%tmp = getelementptr inbounds float, float* %B, i64 %i.0
|
||||
%tmp7 = getelementptr inbounds float, float* %A, i64 %i.0
|
||||
%tmp6 = load float, float* %tmp, align 4
|
||||
store float %tmp6, float* %tmp7, align 4
|
||||
; CHECK: %tmp6_p_scalar_ = load float, float* %scevgep, align 4, !alias.scope !0, !noalias !2
|
||||
; CHECK: store float %tmp6_p_scalar_, float* %scevgep8, align 4, !alias.scope !3, !noalias !4
|
||||
br label %bb8
|
||||
|
||||
bb8: ; preds = %bb5
|
||||
%tmp9 = add nsw i64 %j.0, 1
|
||||
br label %bb4
|
||||
|
||||
bb10: ; preds = %bb4
|
||||
br label %bb11
|
||||
|
||||
bb11: ; preds = %bb10
|
||||
%tmp12 = add nsw i64 %i.0, 1
|
||||
br label %bb2
|
||||
|
||||
bb13: ; preds = %bb2
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user