@@ -120,17 +120,18 @@ static APInt createElementMask(const llvm::DataLayout &DL,
120120 return mask;
121121}
122122
123- void EnumPayload::insertValue (IRGenFunction &IGF, llvm::Value *value,
123+ void EnumPayload::insertValue (IRGenModule &IGM,
124+ IRBuilder &builder, llvm::Value *value,
124125 unsigned payloadOffset) {
125- auto &DL = IGF. IGM .DataLayout ;
126+ auto &DL = IGM.DataLayout ;
126127
127128 // Create a mask for the value we are going to insert.
128129 auto type = value->getType ();
129130 auto payloadSize = getAllocSizeInBits (DL);
130131 auto mask = createElementMask (DL, type, payloadOffset, payloadSize);
131132
132133 // Scatter the value into the payload.
133- emitScatterBits (IGF , mask, value);
134+ emitScatterBits (IGM, builder , mask, value);
134135}
135136
136137llvm::Value *EnumPayload::extractValue (IRGenFunction &IGF, llvm::Type *type,
@@ -175,13 +176,14 @@ void EnumPayload::explode(IRGenModule &IGM, Explosion &out) const {
175176 }
176177}
177178
178- void EnumPayload::packIntoEnumPayload (IRGenFunction &IGF,
179+ void EnumPayload::packIntoEnumPayload (IRGenModule &IGM,
180+ IRBuilder &builder,
179181 EnumPayload &outerPayload,
180182 unsigned bitOffset) const {
181- auto &DL = IGF. IGM .DataLayout ;
183+ auto &DL = IGM.DataLayout ;
182184 for (auto &value : PayloadValues) {
183185 auto v = forcePayloadValue (value);
184- outerPayload.insertValue (IGF , v, bitOffset);
186+ outerPayload.insertValue (IGM, builder , v, bitOffset);
185187 bitOffset += DL.getTypeSizeInBits (v->getType ());
186188 }
187189}
@@ -419,12 +421,13 @@ EnumPayload::emitApplyAndMask(IRGenFunction &IGF, const APInt &mask) {
419421}
420422
421423void
422- EnumPayload::emitApplyOrMask (IRGenFunction &IGF, const APInt &mask) {
424+ EnumPayload::emitApplyOrMask (IRGenModule &IGM,
425+ IRBuilder &builder, const APInt &mask) {
423426 // Early exit if the mask has no effect.
424427 if (mask == 0 )
425428 return ;
426429
427- auto &DL = IGF. IGM .DataLayout ;
430+ auto &DL = IGM.DataLayout ;
428431 auto maskReader = BitPatternReader (mask, DL.isLittleEndian ());
429432
430433 for (auto &pv : PayloadValues) {
@@ -438,21 +441,21 @@ EnumPayload::emitApplyOrMask(IRGenFunction &IGF, const APInt &mask) {
438441 if (maskPiece == 0 )
439442 continue ;
440443
441- auto payloadIntTy = llvm::IntegerType::get (IGF. IGM .getLLVMContext (), size);
444+ auto payloadIntTy = llvm::IntegerType::get (IGM.getLLVMContext (), size);
442445 auto maskConstant = llvm::ConstantInt::get (payloadIntTy, maskPiece);
443446
444447 // If the payload value is vacant, or the mask is all ones,
445448 // we can adopt the mask value directly.
446449 if (pv.is <llvm::Type *>() || maskPiece.isAllOnesValue ()) {
447- pv = IGF. Builder .CreateBitOrPointerCast (maskConstant, payloadTy);
450+ pv = builder .CreateBitOrPointerCast (maskConstant, payloadTy);
448451 continue ;
449452 }
450453
451454 // Otherwise, apply the mask to the existing value.
452455 auto v = pv.get <llvm::Value*>();
453- v = IGF. Builder .CreateBitOrPointerCast (v, payloadIntTy);
454- v = IGF. Builder .CreateOr (v, maskConstant);
455- v = IGF. Builder .CreateBitOrPointerCast (v, payloadTy);
456+ v = builder .CreateBitOrPointerCast (v, payloadIntTy);
457+ v = builder .CreateOr (v, maskConstant);
458+ v = builder .CreateBitOrPointerCast (v, payloadTy);
456459 pv = v;
457460 }
458461}
@@ -490,11 +493,11 @@ EnumPayload::emitApplyOrMask(IRGenFunction &IGF,
490493 }
491494}
492495
493- void EnumPayload::emitScatterBits (IRGenFunction &IGF,
496+ void EnumPayload::emitScatterBits (IRGenModule &IGM,
497+ IRBuilder &builder,
494498 const APInt &mask,
495499 llvm::Value *value) {
496- auto &DL = IGF.IGM .DataLayout ;
497- auto &B = IGF.Builder ;
500+ auto &DL = IGM.DataLayout ;
498501
499502 unsigned valueBits = DL.getTypeSizeInBits (value->getType ());
500503 auto totalBits = std::min (valueBits, mask.countPopulation ());
@@ -519,20 +522,20 @@ void EnumPayload::emitScatterBits(IRGenFunction &IGF,
519522 if (DL.isBigEndian ()) {
520523 offset = totalBits - partCount - usedBits;
521524 }
522- auto partValue = irgen::emitScatterBits (IGF , partMask, value, offset);
525+ auto partValue = irgen::emitScatterBits (IGM, builder , partMask, value, offset);
523526
524527 // If necessary OR with the existing value.
525528 if (auto existingValue = pv.dyn_cast <llvm::Value*>()) {
526529 if (partType != partValue->getType ()) {
527- existingValue = B .CreateBitOrPointerCast (existingValue,
530+ existingValue = builder .CreateBitOrPointerCast (existingValue,
528531 partValue->getType ());
529532 }
530- partValue = B .CreateOr (partValue, existingValue);
533+ partValue = builder .CreateOr (partValue, existingValue);
531534 }
532535
533536 // Convert the integer result to the target type.
534537 if (partType != partValue->getType ()) {
535- partValue = B .CreateBitOrPointerCast (partValue, partType);
538+ partValue = builder .CreateBitOrPointerCast (partValue, partType);
536539 }
537540
538541 // Update this payload element.
0 commit comments