60
60
#include " llvm/Transforms/Utils/UnrollLoop.h"
61
61
62
62
#include < cassert>
63
+ #include < cstddef>
63
64
#include < cstdint>
64
65
#include < optional>
65
66
@@ -4005,57 +4006,44 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createScan(
4005
4006
ArrayRef<llvm::Value *> ScanVars, ArrayRef<llvm::Type *> ScanVarsType,
4006
4007
bool IsInclusive) {
4007
4008
if (ScanInfo.OMPFirstScanLoop ) {
4008
- llvm::Error Err = emitScanBasedDirectiveDeclsIR (AllocaIP, ScanVars, ScanVarsType);
4009
+ llvm::Error Err =
4010
+ emitScanBasedDirectiveDeclsIR (AllocaIP, ScanVars, ScanVarsType);
4009
4011
if (Err) {
4010
4012
return Err;
4011
4013
}
4012
4014
}
4013
4015
if (!updateToLocation (Loc))
4014
4016
return Loc.IP ;
4015
-
4016
- unsigned int defaultAS = M.getDataLayout ().getProgramAddressSpace ();
4017
+
4017
4018
llvm::Value *IV = ScanInfo.IV ;
4018
4019
4019
4020
if (ScanInfo.OMPFirstScanLoop ) {
4020
4021
// 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);
4023
4025
Type *DestTy = ScanVarsType[i];
4024
4026
Value *Val = Builder.CreateInBoundsGEP (DestTy, Buff, IV, " arrayOffset" );
4025
4027
Value *Src = Builder.CreateLoad (DestTy, ScanVars[i]);
4026
- Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast (
4027
- Val, DestTy->getPointerTo (defaultAS));
4028
4028
4029
- Builder.CreateStore (Src, Dest );
4029
+ Builder.CreateStore (Src, Val );
4030
4030
}
4031
4031
}
4032
4032
Builder.CreateBr (ScanInfo.OMPScanLoopExit );
4033
4033
emitBlock (ScanInfo.OMPScanDispatch , Builder.GetInsertBlock ()->getParent ());
4034
4034
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
-
4045
4035
if (!ScanInfo.OMPFirstScanLoop ) {
4046
4036
IV = ScanInfo.IV ;
4047
4037
// Emit red = buffer[i]; at the entrance to the scan phase.
4048
4038
// 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);
4051
4042
Type *DestTy = ScanVarsType[i];
4052
4043
Value *SrcPtr =
4053
4044
Builder.CreateInBoundsGEP (DestTy, Buff, IV, " arrayOffset" );
4054
4045
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]);
4059
4047
}
4060
4048
}
4061
4049
@@ -4074,26 +4062,29 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createScan(
4074
4062
}
4075
4063
4076
4064
Error OpenMPIRBuilder::emitScanBasedDirectiveDeclsIR (
4077
- InsertPointTy AllocaIP, ArrayRef<Value *> ScanVars, ArrayRef<Type *> ScanVarsType) {
4078
-
4065
+ InsertPointTy AllocaIP, ArrayRef<Value *> ScanVars,
4066
+ ArrayRef<Type *> ScanVarsType) {
4067
+
4079
4068
Builder.restoreIP (AllocaIP);
4080
4069
// 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;
4084
4074
}
4085
4075
4086
- // Allocate temporary buffer by master thread
4076
+ // Allocate temporary buffer by master thread
4087
4077
auto BodyGenCB = [&](InsertPointTy AllocaIP,
4088
4078
InsertPointTy CodeGenIP) -> Error {
4089
4079
Builder.restoreIP (CodeGenIP);
4090
4080
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]]);
4097
4088
}
4098
4089
return Error::success ();
4099
4090
};
@@ -4110,7 +4101,7 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveDeclsIR(
4110
4101
return AfterIP.takeError ();
4111
4102
Builder.restoreIP (*AfterIP);
4112
4103
BasicBlock *InputBB = Builder.GetInsertBlock ();
4113
- if (InputBB->getTerminator ())
4104
+ if (InputBB->getTerminator ())
4114
4105
Builder.SetInsertPoint (Builder.GetInsertBlock ()->getTerminator ());
4115
4106
AfterIP = createBarrier (Builder.saveIP (), llvm::omp::OMPD_barrier);
4116
4107
if (!AfterIP)
@@ -4125,21 +4116,19 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveFinalsIR(
4125
4116
auto BodyGenCB = [&](InsertPointTy AllocaIP,
4126
4117
InsertPointTy CodeGenIP) -> Error {
4127
4118
Builder.restoreIP (CodeGenIP);
4128
- unsigned int DefaultAS = M.getDataLayout ().getProgramAddressSpace ();
4129
4119
for (ReductionInfo RedInfo : ReductionInfos) {
4130
4120
Value *PrivateVar = RedInfo.PrivateVariable ;
4131
4121
Value *OrigVar = RedInfo.Variable ;
4132
- Value *Buff = ScanInfo.ReductionVarToScanBuffs [PrivateVar];
4122
+ Value *BuffPtr = ScanInfo.ScanBuffPtrs [PrivateVar];
4123
+ Value *Buff = Builder.CreateLoad (Builder.getPtrTy (), BuffPtr);
4133
4124
4134
4125
Type *SrcTy = RedInfo.ElementType ;
4135
4126
Value *Val =
4136
4127
Builder.CreateInBoundsGEP (SrcTy, Buff, ScanInfo.Span , " arrayOffset" );
4137
4128
Value *Src = Builder.CreateLoad (SrcTy, Val);
4138
- Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast (
4139
- OrigVar, SrcTy->getPointerTo (DefaultAS));
4140
4129
4141
- Builder.CreateStore (Src, Dest );
4142
- // Builder.CreateFree(Buff);
4130
+ Builder.CreateStore (Src, OrigVar );
4131
+ Builder.CreateFree (Buff);
4143
4132
}
4144
4133
return Error::success ();
4145
4134
};
@@ -4156,7 +4145,7 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveFinalsIR(
4156
4145
return AfterIP.takeError ();
4157
4146
Builder.restoreIP (*AfterIP);
4158
4147
BasicBlock *InputBB = Builder.GetInsertBlock ();
4159
- if (InputBB->getTerminator ())
4148
+ if (InputBB->getTerminator ())
4160
4149
Builder.SetInsertPoint (Builder.GetInsertBlock ()->getTerminator ());
4161
4150
AfterIP = createBarrier (Builder.saveIP (), llvm::omp::OMPD_barrier);
4162
4151
if (!AfterIP)
@@ -4166,14 +4155,15 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveFinalsIR(
4166
4155
}
4167
4156
4168
4157
OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitScanReduction (
4169
- const LocationDescription &Loc, SmallVector<llvm::OpenMPIRBuilder::ReductionInfo> ReductionInfos) {
4158
+ const LocationDescription &Loc,
4159
+ SmallVector<llvm::OpenMPIRBuilder::ReductionInfo> ReductionInfos) {
4170
4160
4171
4161
if (!updateToLocation (Loc))
4172
4162
return Loc.IP ;
4173
4163
auto BodyGenCB = [&](InsertPointTy AllocaIP,
4174
4164
InsertPointTy CodeGenIP) -> Error {
4175
4165
Builder.restoreIP (CodeGenIP);
4176
- auto CurFn = Builder.GetInsertBlock ()->getParent ();
4166
+ Function * CurFn = Builder.GetInsertBlock ()->getParent ();
4177
4167
// for (int k = 0; k <= ceil(log2(n)); ++k)
4178
4168
llvm::BasicBlock *LoopBB =
4179
4169
BasicBlock::Create (CurFn->getContext (), " omp.outer.log.scan.body" );
@@ -4217,10 +4207,10 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitScanReduction(
4217
4207
Builder.SetInsertPoint (InnerLoopBB);
4218
4208
auto *IVal = Builder.CreatePHI (Builder.getInt32Ty (), 2 );
4219
4209
IVal->addIncoming (NMin1, LoopBB);
4220
- unsigned int defaultAS = M.getDataLayout ().getProgramAddressSpace ();
4221
4210
for (ReductionInfo RedInfo : ReductionInfos) {
4222
4211
Value *ReductionVal = RedInfo.PrivateVariable ;
4223
- Value *Buff = ScanInfo.ReductionVarToScanBuffs [ReductionVal];
4212
+ Value *BuffPtr = ScanInfo.ScanBuffPtrs [ReductionVal];
4213
+ Value *Buff = Builder.CreateLoad (Builder.getPtrTy (), BuffPtr);
4224
4214
Type *DestTy = RedInfo.ElementType ;
4225
4215
Value *IV = Builder.CreateAdd (IVal, Builder.getInt32 (1 ));
4226
4216
Value *LHSPtr =
@@ -4230,14 +4220,12 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitScanReduction(
4230
4220
Builder.CreateInBoundsGEP (DestTy, Buff, OffsetIval, " arrayOffset" );
4231
4221
Value *LHS = Builder.CreateLoad (DestTy, LHSPtr);
4232
4222
Value *RHS = Builder.CreateLoad (DestTy, RHSPtr);
4233
- Value *LHSAddr = Builder.CreatePointerBitCastOrAddrSpaceCast (
4234
- LHSPtr, RHS->getType ()->getPointerTo (defaultAS));
4235
4223
llvm::Value *Result;
4236
4224
InsertPointOrErrorTy AfterIP =
4237
4225
RedInfo.ReductionGen (Builder.saveIP (), LHS, RHS, Result);
4238
4226
if (!AfterIP)
4239
4227
return AfterIP.takeError ();
4240
- Builder.CreateStore (Result, LHSAddr );
4228
+ Builder.CreateStore (Result, LHSPtr );
4241
4229
}
4242
4230
llvm::Value *NextIVal = Builder.CreateNUWSub (
4243
4231
IVal, llvm::ConstantInt::get (Builder.getInt32Ty (), 1 ));
@@ -4312,8 +4300,6 @@ Error OpenMPIRBuilder::emitScanBasedDirectiveIR(
4312
4300
4313
4301
void OpenMPIRBuilder::createScanBBs () {
4314
4302
Function *Fun = Builder.GetInsertBlock ()->getParent ();
4315
- ScanInfo.OMPScanExitBlock =
4316
- BasicBlock::Create (Fun->getContext (), " omp.exit.inscan.bb" );
4317
4303
ScanInfo.OMPScanDispatch =
4318
4304
BasicBlock::Create (Fun->getContext (), " omp.inscan.dispatch" );
4319
4305
ScanInfo.OMPAfterScanBlock =
@@ -4481,8 +4467,8 @@ OpenMPIRBuilder::createCanonicalScanLoops(
4481
4467
SmallVector<llvm::CanonicalLoopInfo *> Result;
4482
4468
const auto &&InputLoopGen = [&]() -> Error {
4483
4469
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 );
4486
4472
if (!LoopInfo)
4487
4473
return LoopInfo.takeError ();
4488
4474
Result.push_back (*LoopInfo);
@@ -4497,7 +4483,7 @@ OpenMPIRBuilder::createCanonicalScanLoops(
4497
4483
return LoopInfo.takeError ();
4498
4484
Result.push_back (*LoopInfo);
4499
4485
Builder.restoreIP ((*LoopInfo)->getAfterIP ());
4500
- ScanInfo.OMPScanFinish = Builder.GetInsertBlock ();
4486
+ ScanInfo.OMPScanFinish = Builder.GetInsertBlock ();
4501
4487
return Error::success ();
4502
4488
};
4503
4489
Error Err = emitScanBasedDirectiveIR (InputLoopGen, ScanLoopGen);
0 commit comments