@@ -120,17 +120,18 @@ static APInt createElementMask(const llvm::DataLayout &DL,
120
120
return mask;
121
121
}
122
122
123
- void EnumPayload::insertValue (IRGenFunction &IGF, llvm::Value *value,
123
+ void EnumPayload::insertValue (IRGenModule &IGM,
124
+ IRBuilder &builder, llvm::Value *value,
124
125
unsigned payloadOffset) {
125
- auto &DL = IGF. IGM .DataLayout ;
126
+ auto &DL = IGM.DataLayout ;
126
127
127
128
// Create a mask for the value we are going to insert.
128
129
auto type = value->getType ();
129
130
auto payloadSize = getAllocSizeInBits (DL);
130
131
auto mask = createElementMask (DL, type, payloadOffset, payloadSize);
131
132
132
133
// Scatter the value into the payload.
133
- emitScatterBits (IGF , mask, value);
134
+ emitScatterBits (IGM, builder , mask, value);
134
135
}
135
136
136
137
llvm::Value *EnumPayload::extractValue (IRGenFunction &IGF, llvm::Type *type,
@@ -175,13 +176,14 @@ void EnumPayload::explode(IRGenModule &IGM, Explosion &out) const {
175
176
}
176
177
}
177
178
178
- void EnumPayload::packIntoEnumPayload (IRGenFunction &IGF,
179
+ void EnumPayload::packIntoEnumPayload (IRGenModule &IGM,
180
+ IRBuilder &builder,
179
181
EnumPayload &outerPayload,
180
182
unsigned bitOffset) const {
181
- auto &DL = IGF. IGM .DataLayout ;
183
+ auto &DL = IGM.DataLayout ;
182
184
for (auto &value : PayloadValues) {
183
185
auto v = forcePayloadValue (value);
184
- outerPayload.insertValue (IGF , v, bitOffset);
186
+ outerPayload.insertValue (IGM, builder , v, bitOffset);
185
187
bitOffset += DL.getTypeSizeInBits (v->getType ());
186
188
}
187
189
}
@@ -419,12 +421,13 @@ EnumPayload::emitApplyAndMask(IRGenFunction &IGF, const APInt &mask) {
419
421
}
420
422
421
423
void
422
- EnumPayload::emitApplyOrMask (IRGenFunction &IGF, const APInt &mask) {
424
+ EnumPayload::emitApplyOrMask (IRGenModule &IGM,
425
+ IRBuilder &builder, const APInt &mask) {
423
426
// Early exit if the mask has no effect.
424
427
if (mask == 0 )
425
428
return ;
426
429
427
- auto &DL = IGF. IGM .DataLayout ;
430
+ auto &DL = IGM.DataLayout ;
428
431
auto maskReader = BitPatternReader (mask, DL.isLittleEndian ());
429
432
430
433
for (auto &pv : PayloadValues) {
@@ -438,21 +441,21 @@ EnumPayload::emitApplyOrMask(IRGenFunction &IGF, const APInt &mask) {
438
441
if (maskPiece == 0 )
439
442
continue ;
440
443
441
- auto payloadIntTy = llvm::IntegerType::get (IGF. IGM .getLLVMContext (), size);
444
+ auto payloadIntTy = llvm::IntegerType::get (IGM.getLLVMContext (), size);
442
445
auto maskConstant = llvm::ConstantInt::get (payloadIntTy, maskPiece);
443
446
444
447
// If the payload value is vacant, or the mask is all ones,
445
448
// we can adopt the mask value directly.
446
449
if (pv.is <llvm::Type *>() || maskPiece.isAllOnesValue ()) {
447
- pv = IGF. Builder .CreateBitOrPointerCast (maskConstant, payloadTy);
450
+ pv = builder .CreateBitOrPointerCast (maskConstant, payloadTy);
448
451
continue ;
449
452
}
450
453
451
454
// Otherwise, apply the mask to the existing value.
452
455
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);
456
459
pv = v;
457
460
}
458
461
}
@@ -490,11 +493,11 @@ EnumPayload::emitApplyOrMask(IRGenFunction &IGF,
490
493
}
491
494
}
492
495
493
- void EnumPayload::emitScatterBits (IRGenFunction &IGF,
496
+ void EnumPayload::emitScatterBits (IRGenModule &IGM,
497
+ IRBuilder &builder,
494
498
const APInt &mask,
495
499
llvm::Value *value) {
496
- auto &DL = IGF.IGM .DataLayout ;
497
- auto &B = IGF.Builder ;
500
+ auto &DL = IGM.DataLayout ;
498
501
499
502
unsigned valueBits = DL.getTypeSizeInBits (value->getType ());
500
503
auto totalBits = std::min (valueBits, mask.countPopulation ());
@@ -519,20 +522,20 @@ void EnumPayload::emitScatterBits(IRGenFunction &IGF,
519
522
if (DL.isBigEndian ()) {
520
523
offset = totalBits - partCount - usedBits;
521
524
}
522
- auto partValue = irgen::emitScatterBits (IGF , partMask, value, offset);
525
+ auto partValue = irgen::emitScatterBits (IGM, builder , partMask, value, offset);
523
526
524
527
// If necessary OR with the existing value.
525
528
if (auto existingValue = pv.dyn_cast <llvm::Value*>()) {
526
529
if (partType != partValue->getType ()) {
527
- existingValue = B .CreateBitOrPointerCast (existingValue,
530
+ existingValue = builder .CreateBitOrPointerCast (existingValue,
528
531
partValue->getType ());
529
532
}
530
- partValue = B .CreateOr (partValue, existingValue);
533
+ partValue = builder .CreateOr (partValue, existingValue);
531
534
}
532
535
533
536
// Convert the integer result to the target type.
534
537
if (partType != partValue->getType ()) {
535
- partValue = B .CreateBitOrPointerCast (partValue, partType);
538
+ partValue = builder .CreateBitOrPointerCast (partValue, partType);
536
539
}
537
540
538
541
// Update this payload element.
0 commit comments