Skip to content

Commit 0d343a6

Browse files
committed
New changes
1 parent 2ae5772 commit 0d343a6

File tree

3 files changed

+63
-68
lines changed

3 files changed

+63
-68
lines changed

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ class OpenMPIRBuilder {
503503
return allocaInst;
504504
}
505505
};
506-
506+
507507
/// Type used throughout for insertion points.
508508
using InsertPointTy = IRBuilder<>::InsertPoint;
509509

@@ -512,16 +512,24 @@ class OpenMPIRBuilder {
512512

513513
struct ScanInformation {
514514
public:
515+
/// Dominates the body of the loop before scan directive
515516
llvm::BasicBlock *OMPBeforeScanBlock = nullptr;
517+
/// Dominates the body of the loop before scan directive
516518
llvm::BasicBlock *OMPAfterScanBlock = nullptr;
517-
llvm::BasicBlock *OMPScanExitBlock = nullptr;
519+
/// Controls the flow to before or after scan blocks
518520
llvm::BasicBlock *OMPScanDispatch = nullptr;
521+
/// Exit block of loop body
519522
llvm::BasicBlock *OMPScanLoopExit = nullptr;
523+
/// Block before loop body where scan initializations are done
520524
llvm::BasicBlock *OMPScanInit = nullptr;
525+
/// Block after loop body where scan finalizations are done
521526
llvm::BasicBlock *OMPScanFinish = nullptr;
522-
InsertPointTy FinalizeIP;
527+
/// If true, it indicates Input phase is lowered; else it indicates
528+
/// ScanPhase is lowered
523529
bool OMPFirstScanLoop = false;
524-
llvm::SmallDenseMap<llvm::Value *, llvm::Value *> ReductionVarToScanBuffs;
530+
// Maps the private reduction variable to the pointer of the temporary
531+
// buffer
532+
llvm::SmallDenseMap<llvm::Value *, llvm::Value *> ScanBuffPtrs;
525533
llvm::Value *IV;
526534
llvm::Value *Span;
527535
} ScanInfo;
@@ -1605,12 +1613,13 @@ class OpenMPIRBuilder {
16051613
void createScanBBs();
16061614

16071615
/// Dynamically allocates the buffer needed for scan reduction.
1608-
/// \param AllocaIP The IP where possibly-shared pointer of buffer needs to be declared.
1609-
/// \param ScanVars Scan Variables.
1616+
/// \param AllocaIP The IP where possibly-shared pointer of buffer needs to be
1617+
/// declared. \param ScanVars Scan Variables.
16101618
///
16111619
/// \return error if any produced, else return success.
1612-
Error emitScanBasedDirectiveDeclsIR(InsertPointTy AllocaIP, ArrayRef<llvm::Value *> ScanVars,
1613-
ArrayRef<llvm::Type *> ScanVarsType);
1620+
Error emitScanBasedDirectiveDeclsIR(InsertPointTy AllocaIP,
1621+
ArrayRef<llvm::Value *> ScanVars,
1622+
ArrayRef<llvm::Type *> ScanVarsType);
16141623

16151624
/// Copies the result back to the reduction variable.
16161625
/// \param ReductionInfos Array type containing the ReductionOps.
@@ -2709,7 +2718,8 @@ class OpenMPIRBuilder {
27092718
///
27102719
/// \returns The insertion position *after* the masked.
27112720
InsertPointOrErrorTy emitScanReduction(
2712-
const LocationDescription &Loc, SmallVector<llvm::OpenMPIRBuilder::ReductionInfo> ReductionInfos);
2721+
const LocationDescription &Loc,
2722+
SmallVector<llvm::OpenMPIRBuilder::ReductionInfo> ReductionInfos);
27132723

27142724
/// This directive split and directs the control flow to input phase
27152725
/// blocks or scan phase blocks based on 1. whether input loop or scan loop

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 42 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
#include "llvm/Transforms/Utils/UnrollLoop.h"
6161

6262
#include <cassert>
63+
#include <cstddef>
6364
#include <cstdint>
6465
#include <optional>
6566

@@ -4005,57 +4006,44 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createScan(
40054006
ArrayRef<llvm::Value *> ScanVars, ArrayRef<llvm::Type *> ScanVarsType,
40064007
bool IsInclusive) {
40074008
if (ScanInfo.OMPFirstScanLoop) {
4008-
llvm::Error Err = emitScanBasedDirectiveDeclsIR(AllocaIP, ScanVars, ScanVarsType);
4009+
llvm::Error Err =
4010+
emitScanBasedDirectiveDeclsIR(AllocaIP, ScanVars, ScanVarsType);
40094011
if (Err) {
40104012
return Err;
40114013
}
40124014
}
40134015
if (!updateToLocation(Loc))
40144016
return Loc.IP;
4015-
4016-
unsigned int defaultAS = M.getDataLayout().getProgramAddressSpace();
4017+
40174018
llvm::Value *IV = ScanInfo.IV;
40184019

40194020
if (ScanInfo.OMPFirstScanLoop) {
40204021
// Emit buffer[i] = red; at the end of the input phase.
4021-
for (int i = 0; i < ScanVars.size(); i++) {
4022-
Value *Buff = ScanInfo.ReductionVarToScanBuffs[ScanVars[i]];
4022+
for (size_t i = 0; i < ScanVars.size(); i++) {
4023+
Value *BuffPtr = ScanInfo.ScanBuffPtrs[ScanVars[i]];
4024+
Value *Buff = Builder.CreateLoad(Builder.getPtrTy(), BuffPtr);
40234025
Type *DestTy = ScanVarsType[i];
40244026
Value *Val = Builder.CreateInBoundsGEP(DestTy, Buff, IV, "arrayOffset");
40254027
Value *Src = Builder.CreateLoad(DestTy, ScanVars[i]);
4026-
Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast(
4027-
Val, DestTy->getPointerTo(defaultAS));
40284028

4029-
Builder.CreateStore(Src, Dest);
4029+
Builder.CreateStore(Src, Val);
40304030
}
40314031
}
40324032
Builder.CreateBr(ScanInfo.OMPScanLoopExit);
40334033
emitBlock(ScanInfo.OMPScanDispatch, Builder.GetInsertBlock()->getParent());
40344034

4035-
// Initialize the private reduction variable to 0 in each iteration.
4036-
// It is used to copy intial values to scan buffer.
4037-
ConstantInt *Zero = ConstantInt::get(Builder.getInt32Ty(), 0);
4038-
for (int i = 0; i < ScanVars.size(); i++) {
4039-
Type *DestTy = ScanVarsType[i];
4040-
Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast(
4041-
ScanVars[i], DestTy->getPointerTo(defaultAS));
4042-
Builder.CreateStore(Zero, Dest);
4043-
}
4044-
40454035
if (!ScanInfo.OMPFirstScanLoop) {
40464036
IV = ScanInfo.IV;
40474037
// Emit red = buffer[i]; at the entrance to the scan phase.
40484038
// TODO: if exclusive scan, the red = buffer[i-1] needs to be updated.
4049-
for (int i = 0; i < ScanVars.size(); i++) {
4050-
Value *Buff = ScanInfo.ReductionVarToScanBuffs[ScanVars[i]];
4039+
for (size_t i = 0; i < ScanVars.size(); i++) {
4040+
Value *BuffPtr = ScanInfo.ScanBuffPtrs[ScanVars[i]];
4041+
Value *Buff = Builder.CreateLoad(Builder.getPtrTy(), BuffPtr);
40514042
Type *DestTy = ScanVarsType[i];
40524043
Value *SrcPtr =
40534044
Builder.CreateInBoundsGEP(DestTy, Buff, IV, "arrayOffset");
40544045
Value *Src = Builder.CreateLoad(DestTy, SrcPtr);
4055-
Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast(
4056-
ScanVars[i], DestTy->getPointerTo(defaultAS));
4057-
4058-
Builder.CreateStore(Src, Dest);
4046+
Builder.CreateStore(Src, ScanVars[i]);
40594047
}
40604048
}
40614049

@@ -4074,26 +4062,29 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createScan(
40744062
}
40754063

40764064
Error OpenMPIRBuilder::emitScanBasedDirectiveDeclsIR(
4077-
InsertPointTy AllocaIP, ArrayRef<Value *> ScanVars, ArrayRef<Type *> ScanVarsType) {
4078-
4065+
InsertPointTy AllocaIP, ArrayRef<Value *> ScanVars,
4066+
ArrayRef<Type *> ScanVarsType) {
4067+
40794068
Builder.restoreIP(AllocaIP);
40804069
// Create the shared pointer at alloca IP.
4081-
for(int i=0; i<ScanVars.size(); i++){
4082-
llvm::Value *Buff = Builder.CreateAlloca(Builder.getPtrTy(),1);
4083-
ScanInfo.ReductionVarToScanBuffs[ScanVars[i]] = Buff;
4070+
for (size_t i = 0; i < ScanVars.size(); i++) {
4071+
llvm::Value *BuffPtr =
4072+
Builder.CreateAlloca(Builder.getPtrTy(), nullptr, "vla");
4073+
ScanInfo.ScanBuffPtrs[ScanVars[i]] = BuffPtr;
40844074
}
40854075

4086-
// Allocate temporary buffer by master thread
4076+
// Allocate temporary buffer by master thread
40874077
auto BodyGenCB = [&](InsertPointTy AllocaIP,
40884078
InsertPointTy CodeGenIP) -> Error {
40894079
Builder.restoreIP(CodeGenIP);
40904080
Value *AllocSpan = Builder.CreateAdd(ScanInfo.Span, Builder.getInt32(1));
4091-
for (int i = 0; i < ScanVars.size(); i++) {
4092-
Type* IntPtrTy = Builder.getInt32Ty();
4093-
Constant* allocsize = ConstantExpr::getSizeOf(ScanVarsType[i]);
4094-
allocsize = ConstantExpr::getTruncOrBitCast(allocsize, IntPtrTy);
4095-
llvm::Value *Buff = Builder.CreateMalloc(IntPtrTy, ScanVarsType[i], allocsize,AllocSpan,nullptr, "arr");
4096-
Builder.CreateStore(Buff, ScanInfo.ReductionVarToScanBuffs[ScanVars[i]]);
4081+
for (size_t i = 0; i < ScanVars.size(); i++) {
4082+
Type *IntPtrTy = Builder.getInt32Ty();
4083+
Constant *Allocsize = ConstantExpr::getSizeOf(ScanVarsType[i]);
4084+
Allocsize = ConstantExpr::getTruncOrBitCast(Allocsize, IntPtrTy);
4085+
Value *Buff = Builder.CreateMalloc(IntPtrTy, ScanVarsType[i], Allocsize,
4086+
AllocSpan, nullptr, "arr");
4087+
Builder.CreateStore(Buff, ScanInfo.ScanBuffPtrs[ScanVars[i]]);
40974088
}
40984089
return Error::success();
40994090
};
@@ -4110,7 +4101,7 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveDeclsIR(
41104101
return AfterIP.takeError();
41114102
Builder.restoreIP(*AfterIP);
41124103
BasicBlock *InputBB = Builder.GetInsertBlock();
4113-
if(InputBB->getTerminator())
4104+
if (InputBB->getTerminator())
41144105
Builder.SetInsertPoint(Builder.GetInsertBlock()->getTerminator());
41154106
AfterIP = createBarrier(Builder.saveIP(), llvm::omp::OMPD_barrier);
41164107
if (!AfterIP)
@@ -4125,21 +4116,19 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveFinalsIR(
41254116
auto BodyGenCB = [&](InsertPointTy AllocaIP,
41264117
InsertPointTy CodeGenIP) -> Error {
41274118
Builder.restoreIP(CodeGenIP);
4128-
unsigned int DefaultAS = M.getDataLayout().getProgramAddressSpace();
41294119
for (ReductionInfo RedInfo : ReductionInfos) {
41304120
Value *PrivateVar = RedInfo.PrivateVariable;
41314121
Value *OrigVar = RedInfo.Variable;
4132-
Value *Buff = ScanInfo.ReductionVarToScanBuffs[PrivateVar];
4122+
Value *BuffPtr = ScanInfo.ScanBuffPtrs[PrivateVar];
4123+
Value *Buff = Builder.CreateLoad(Builder.getPtrTy(), BuffPtr);
41334124

41344125
Type *SrcTy = RedInfo.ElementType;
41354126
Value *Val =
41364127
Builder.CreateInBoundsGEP(SrcTy, Buff, ScanInfo.Span, "arrayOffset");
41374128
Value *Src = Builder.CreateLoad(SrcTy, Val);
4138-
Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast(
4139-
OrigVar, SrcTy->getPointerTo(DefaultAS));
41404129

4141-
Builder.CreateStore(Src, Dest);
4142-
//Builder.CreateFree(Buff);
4130+
Builder.CreateStore(Src, OrigVar);
4131+
Builder.CreateFree(Buff);
41434132
}
41444133
return Error::success();
41454134
};
@@ -4156,7 +4145,7 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveFinalsIR(
41564145
return AfterIP.takeError();
41574146
Builder.restoreIP(*AfterIP);
41584147
BasicBlock *InputBB = Builder.GetInsertBlock();
4159-
if(InputBB->getTerminator())
4148+
if (InputBB->getTerminator())
41604149
Builder.SetInsertPoint(Builder.GetInsertBlock()->getTerminator());
41614150
AfterIP = createBarrier(Builder.saveIP(), llvm::omp::OMPD_barrier);
41624151
if (!AfterIP)
@@ -4166,14 +4155,15 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveFinalsIR(
41664155
}
41674156

41684157
OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitScanReduction(
4169-
const LocationDescription &Loc, SmallVector<llvm::OpenMPIRBuilder::ReductionInfo> ReductionInfos) {
4158+
const LocationDescription &Loc,
4159+
SmallVector<llvm::OpenMPIRBuilder::ReductionInfo> ReductionInfos) {
41704160

41714161
if (!updateToLocation(Loc))
41724162
return Loc.IP;
41734163
auto BodyGenCB = [&](InsertPointTy AllocaIP,
41744164
InsertPointTy CodeGenIP) -> Error {
41754165
Builder.restoreIP(CodeGenIP);
4176-
auto CurFn = Builder.GetInsertBlock()->getParent();
4166+
Function *CurFn = Builder.GetInsertBlock()->getParent();
41774167
// for (int k = 0; k <= ceil(log2(n)); ++k)
41784168
llvm::BasicBlock *LoopBB =
41794169
BasicBlock::Create(CurFn->getContext(), "omp.outer.log.scan.body");
@@ -4217,10 +4207,10 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitScanReduction(
42174207
Builder.SetInsertPoint(InnerLoopBB);
42184208
auto *IVal = Builder.CreatePHI(Builder.getInt32Ty(), 2);
42194209
IVal->addIncoming(NMin1, LoopBB);
4220-
unsigned int defaultAS = M.getDataLayout().getProgramAddressSpace();
42214210
for (ReductionInfo RedInfo : ReductionInfos) {
42224211
Value *ReductionVal = RedInfo.PrivateVariable;
4223-
Value *Buff = ScanInfo.ReductionVarToScanBuffs[ReductionVal];
4212+
Value *BuffPtr = ScanInfo.ScanBuffPtrs[ReductionVal];
4213+
Value *Buff = Builder.CreateLoad(Builder.getPtrTy(), BuffPtr);
42244214
Type *DestTy = RedInfo.ElementType;
42254215
Value *IV = Builder.CreateAdd(IVal, Builder.getInt32(1));
42264216
Value *LHSPtr =
@@ -4230,14 +4220,12 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitScanReduction(
42304220
Builder.CreateInBoundsGEP(DestTy, Buff, OffsetIval, "arrayOffset");
42314221
Value *LHS = Builder.CreateLoad(DestTy, LHSPtr);
42324222
Value *RHS = Builder.CreateLoad(DestTy, RHSPtr);
4233-
Value *LHSAddr = Builder.CreatePointerBitCastOrAddrSpaceCast(
4234-
LHSPtr, RHS->getType()->getPointerTo(defaultAS));
42354223
llvm::Value *Result;
42364224
InsertPointOrErrorTy AfterIP =
42374225
RedInfo.ReductionGen(Builder.saveIP(), LHS, RHS, Result);
42384226
if (!AfterIP)
42394227
return AfterIP.takeError();
4240-
Builder.CreateStore(Result, LHSAddr);
4228+
Builder.CreateStore(Result, LHSPtr);
42414229
}
42424230
llvm::Value *NextIVal = Builder.CreateNUWSub(
42434231
IVal, llvm::ConstantInt::get(Builder.getInt32Ty(), 1));
@@ -4312,8 +4300,6 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveIR(
43124300

43134301
void OpenMPIRBuilder::createScanBBs() {
43144302
Function *Fun = Builder.GetInsertBlock()->getParent();
4315-
ScanInfo.OMPScanExitBlock =
4316-
BasicBlock::Create(Fun->getContext(), "omp.exit.inscan.bb");
43174303
ScanInfo.OMPScanDispatch =
43184304
BasicBlock::Create(Fun->getContext(), "omp.inscan.dispatch");
43194305
ScanInfo.OMPAfterScanBlock =
@@ -4481,8 +4467,8 @@ OpenMPIRBuilder::createCanonicalScanLoops(
44814467
SmallVector<llvm::CanonicalLoopInfo *> Result;
44824468
const auto &&InputLoopGen = [&]() -> Error {
44834469
auto LoopInfo =
4484-
createCanonicalLoop(Builder.saveIP(), BodyGen, Start, Stop, Step, IsSigned,
4485-
InclusiveStop, ComputeIP, Name, true);
4470+
createCanonicalLoop(Builder.saveIP(), BodyGen, Start, Stop, Step,
4471+
IsSigned, InclusiveStop, ComputeIP, Name, true);
44864472
if (!LoopInfo)
44874473
return LoopInfo.takeError();
44884474
Result.push_back(*LoopInfo);
@@ -4497,7 +4483,7 @@ OpenMPIRBuilder::createCanonicalScanLoops(
44974483
return LoopInfo.takeError();
44984484
Result.push_back(*LoopInfo);
44994485
Builder.restoreIP((*LoopInfo)->getAfterIP());
4500-
ScanInfo.OMPScanFinish= Builder.GetInsertBlock();
4486+
ScanInfo.OMPScanFinish = Builder.GetInsertBlock();
45014487
return Error::success();
45024488
};
45034489
Error Err = emitScanBasedDirectiveIR(InputLoopGen, ScanLoopGen);

llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5392,9 +5392,8 @@ TEST_F(OpenMPIRBuilderTest, ScanReduction) {
53925392
/*ReductionGenClang=*/nullptr, sumAtomicReduction}};
53935393
OpenMPIRBuilder::LocationDescription RedLoc({InputLoop->getAfterIP(), DL});
53945394
llvm::BasicBlock *Cont = splitBB(Builder, false, "omp.scan.loop.cont");
5395-
ASSERT_EXPECTED_INIT(
5396-
InsertPointTy, retIp,
5397-
OMPBuilder.emitScanReduction(RedLoc, reductionInfos));
5395+
ASSERT_EXPECTED_INIT(InsertPointTy, retIp,
5396+
OMPBuilder.emitScanReduction(RedLoc, reductionInfos));
53985397
Builder.restoreIP(retIp);
53995398
Builder.CreateBr(Cont);
54005399
SmallVector<CallInst *> MaskedCalls;

0 commit comments

Comments
 (0)