@@ -4002,10 +4002,11 @@ OpenMPIRBuilder::emitNoUnwindRuntimeCall(llvm::FunctionCallee Callee,
40024002// inclusive scans now.
40034003OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createScan (
40044004 const LocationDescription &Loc, InsertPointTy AllocaIP,
4005- ArrayRef<llvm::Value *> ScanVars, bool IsInclusive) {
4005+ ArrayRef<llvm::Value *> ScanVars, ArrayRef<llvm::Type *> ScanVarsType,
4006+ bool IsInclusive) {
40064007 if (ScanInfo.OMPFirstScanLoop ) {
40074008 Builder.restoreIP (AllocaIP);
4008- emitScanBasedDirectiveDeclsIR (ScanVars);
4009+ emitScanBasedDirectiveDeclsIR (ScanVars, ScanVarsType );
40094010 }
40104011 if (!updateToLocation (Loc))
40114012 return Loc.IP ;
@@ -4014,11 +4015,11 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createScan(
40144015
40154016 if (ScanInfo.OMPFirstScanLoop ) {
40164017 // Emit buffer[i] = red; at the end of the input phase.
4017- for (Value *ScanVar : ScanVars) {
4018- Value *Buff = ScanInfo.ReductionVarToScanBuffs [ScanVar ];
4019- Type *DestTy = Builder. getInt32Ty (); // ScanVars [i]->getType() ;
4018+ for (int i = 0 ; i < ScanVars. size (); i++ ) {
4019+ Value *Buff = ScanInfo.ReductionVarToScanBuffs [ScanVars[i] ];
4020+ Type *DestTy = ScanVarsType [i];
40204021 Value *Val = Builder.CreateInBoundsGEP (DestTy, Buff, IV, " arrayOffset" );
4021- Value *Src = Builder.CreateLoad (DestTy, ScanVar );
4022+ Value *Src = Builder.CreateLoad (DestTy, ScanVars[i] );
40224023 Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast (
40234024 Val, DestTy->getPointerTo (defaultAS));
40244025
@@ -4031,25 +4032,25 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createScan(
40314032 // Initialize the private reduction variable to 0 in each iteration.
40324033 // It is used to copy intial values to scan buffer.
40334034 ConstantInt *Zero = ConstantInt::get (Builder.getInt32Ty (), 0 );
4034- for (Value *ScanVar : ScanVars) {
4035- Type *DestTy = Builder. getInt32Ty (); // ScanVars [i]->getType() ;
4035+ for (int i = 0 ; i < ScanVars. size (); i++ ) {
4036+ Type *DestTy = ScanVarsType [i];
40364037 Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast (
4037- ScanVar , DestTy->getPointerTo (defaultAS));
4038+ ScanVars[i] , DestTy->getPointerTo (defaultAS));
40384039 Builder.CreateStore (Zero, Dest);
40394040 }
40404041
40414042 if (!ScanInfo.OMPFirstScanLoop ) {
40424043 IV = ScanInfo.IV ;
40434044 // Emit red = buffer[i]; at the entrance to the scan phase.
40444045 // TODO: if exclusive scan, the red = buffer[i-1] needs to be updated.
4045- for (Value *ScanVar : ScanVars) {
4046- Value *Buff = ScanInfo.ReductionVarToScanBuffs [ScanVar ];
4047- Type *DestTy = Builder. getInt32Ty (); // ScanVars [i]->getType() ;
4046+ for (int i = 0 ; i < ScanVars. size (); i++ ) {
4047+ Value *Buff = ScanInfo.ReductionVarToScanBuffs [ScanVars[i] ];
4048+ Type *DestTy = ScanVarsType [i];
40484049 Value *SrcPtr =
40494050 Builder.CreateInBoundsGEP (DestTy, Buff, IV, " arrayOffset" );
40504051 Value *Src = Builder.CreateLoad (DestTy, SrcPtr);
40514052 Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast (
4052- ScanVar , DestTy->getPointerTo (defaultAS));
4053+ ScanVars[i] , DestTy->getPointerTo (defaultAS));
40534054
40544055 Builder.CreateStore (Src, Dest);
40554056 }
@@ -4070,29 +4071,26 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createScan(
40704071}
40714072
40724073void OpenMPIRBuilder::emitScanBasedDirectiveDeclsIR (
4073- ArrayRef<Value *> ScanVars) {
4074+ ArrayRef<Value *> ScanVars, ArrayRef<Type *> ScanVarsType ) {
40744075
40754076 Value *AllocSpan = Builder.CreateAdd (ScanInfo.Span , Builder.getInt32 (1 ));
4076- for (Value *ScanVar : ScanVars) {
4077- llvm::Value *Buff =
4078- Builder.CreateAlloca (Builder.getInt32Ty (), AllocSpan, " vla" );
4079- ScanInfo.ReductionVarToScanBuffs [ScanVar] = Buff;
4077+ for (int i = 0 ; i < ScanVars.size (); i++) {
4078+ llvm::Value *Buff = Builder.CreateAlloca (ScanVarsType[i], AllocSpan, " vla" );
4079+ ScanInfo.ReductionVarToScanBuffs [ScanVars[i]] = Buff;
40804080 }
40814081}
40824082
40834083void OpenMPIRBuilder::emitScanBasedDirectiveFinalsIR (
40844084 SmallVector<ReductionInfo> ReductionInfos) {
4085- llvm::Value *OMPLast = Builder.CreateNSWAdd (
4086- ScanInfo.Span ,
4087- llvm::ConstantInt::get (ScanInfo.Span ->getType (), 1 , /* isSigned=*/ false ));
40884085 unsigned int DefaultAS = M.getDataLayout ().getProgramAddressSpace ();
40894086 for (ReductionInfo RedInfo : ReductionInfos) {
40904087 Value *PrivateVar = RedInfo.PrivateVariable ;
40914088 Value *OrigVar = RedInfo.Variable ;
40924089 Value *Buff = ScanInfo.ReductionVarToScanBuffs [PrivateVar];
40934090
40944091 Type *SrcTy = RedInfo.ElementType ;
4095- Value *Val = Builder.CreateInBoundsGEP (SrcTy, Buff, OMPLast, " arrayOffset" );
4092+ Value *Val =
4093+ Builder.CreateInBoundsGEP (SrcTy, Buff, ScanInfo.Span , " arrayOffset" );
40964094 Value *Src = Builder.CreateLoad (SrcTy, Val);
40974095 Value *Dest = Builder.CreatePointerBitCastOrAddrSpaceCast (
40984096 OrigVar, SrcTy->getPointerTo (DefaultAS));
@@ -4120,7 +4118,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitScanReduction(
41204118 (llvm::Intrinsic::ID)llvm::Intrinsic::log2, Builder.getDoubleTy ());
41214119 llvm::BasicBlock *InputBB = Builder.GetInsertBlock ();
41224120 ConstantInt *One = ConstantInt::get (Builder.getInt32Ty (), 1 );
4123- llvm::Value *span = Builder.CreateAdd (spanDiff, One);
4121+ llvm::Value *span = ScanInfo. Span ; // Builder.CreateAdd(spanDiff, One);
41244122 llvm::Value *Arg = Builder.CreateUIToFP (span, Builder.getDoubleTy ());
41254123 llvm::Value *LogVal = emitNoUnwindRuntimeCall (F, Arg, " " );
41264124 F = llvm::Intrinsic::getOrInsertDeclaration (
@@ -5456,7 +5454,7 @@ OpenMPIRBuilder::tileLoops(DebugLoc DL, ArrayRef<CanonicalLoopInfo *> Loops,
54565454 // TODO: It would be sufficient to only sink them into body of the
54575455 // corresponding tile loop.
54585456 SmallVector<std::pair<BasicBlock *, BasicBlock *>, 4 > InbetweenCode;
5459- for (int i = 0 ; i < NumLoops - 1 ; ++i) {
5457+ for (size_t i = 0 ; i < NumLoops - 1 ; ++i) {
54605458 CanonicalLoopInfo *Surrounding = Loops[i];
54615459 CanonicalLoopInfo *Nested = Loops[i + 1 ];
54625460
@@ -5469,7 +5467,7 @@ OpenMPIRBuilder::tileLoops(DebugLoc DL, ArrayRef<CanonicalLoopInfo *> Loops,
54695467 Builder.SetCurrentDebugLocation (DL);
54705468 Builder.restoreIP (OutermostLoop->getPreheaderIP ());
54715469 SmallVector<Value *, 4 > FloorCount, FloorRems;
5472- for (int i = 0 ; i < NumLoops; ++i) {
5470+ for (size_t i = 0 ; i < NumLoops; ++i) {
54735471 Value *TileSize = TileSizes[i];
54745472 Value *OrigTripCount = OrigTripCounts[i];
54755473 Type *IVType = OrigTripCount->getType ();
0 commit comments