@@ -96,7 +96,6 @@ inline Register createTypeVReg(MachineIRBuilder &MIRBuilder) {
96
96
}
97
97
98
98
SPIRVType *SPIRVGlobalRegistry::getOpTypeBool (MachineIRBuilder &MIRBuilder) {
99
-
100
99
return createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
101
100
return MIRBuilder.buildInstr (SPIRV::OpTypeBool)
102
101
.addDef (createTypeVReg (MIRBuilder));
@@ -166,8 +165,11 @@ SPIRVType *SPIRVGlobalRegistry::createOpType(
166
165
167
166
auto LastInsertedType = LastInsertedTypeMap.find (CurMF);
168
167
if (LastInsertedType != LastInsertedTypeMap.end ()) {
169
- MIRBuilder.setInsertPt (*MIRBuilder.getMF ().begin (),
170
- LastInsertedType->second ->getIterator ());
168
+ auto It = LastInsertedType->second ->getIterator ();
169
+ auto NewMBB = MIRBuilder.getMF ().begin ();
170
+ MIRBuilder.setInsertPt (*NewMBB, It->getNextNode ()
171
+ ? It->getNextNode ()->getIterator ()
172
+ : NewMBB->end ());
171
173
} else {
172
174
MIRBuilder.setInsertPt (*MIRBuilder.getMF ().begin (),
173
175
MIRBuilder.getMF ().begin ()->begin ());
@@ -269,24 +271,27 @@ Register SPIRVGlobalRegistry::getOrCreateConstFP(APFloat Val, MachineInstr &I,
269
271
// machine instruction, a new constant instruction should be created.
270
272
if (!New && (!I.getOperand (0 ).isReg () || Res != I.getOperand (0 ).getReg ()))
271
273
return Res;
272
- MachineInstrBuilder MIB;
273
- MachineBasicBlock &BB = *I.getParent ();
274
- // In OpenCL OpConstantNull - Scalar floating point: +0.0 (all bits 0)
275
- if (Val.isPosZero () && ZeroAsNull) {
276
- MIB = BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpConstantNull))
277
- .addDef (Res)
278
- .addUse (getSPIRVTypeID (SpvType));
279
- } else {
280
- MIB = BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpConstantF))
281
- .addDef (Res)
282
- .addUse (getSPIRVTypeID (SpvType));
283
- addNumImm (
284
- APInt (BitWidth, CI->getValueAPF ().bitcastToAPInt ().getZExtValue ()),
285
- MIB);
286
- }
287
- const auto &ST = CurMF->getSubtarget ();
288
- constrainSelectedInstRegOperands (*MIB, *ST.getInstrInfo (),
289
- *ST.getRegisterInfo (), *ST.getRegBankInfo ());
274
+ MachineIRBuilder MIRBuilder (I);
275
+ createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
276
+ MachineInstrBuilder MIB;
277
+ // In OpenCL OpConstantNull - Scalar floating point: +0.0 (all bits 0)
278
+ if (Val.isPosZero () && ZeroAsNull) {
279
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantNull)
280
+ .addDef (Res)
281
+ .addUse (getSPIRVTypeID (SpvType));
282
+ } else {
283
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantF)
284
+ .addDef (Res)
285
+ .addUse (getSPIRVTypeID (SpvType));
286
+ addNumImm (
287
+ APInt (BitWidth, CI->getValueAPF ().bitcastToAPInt ().getZExtValue ()),
288
+ MIB);
289
+ }
290
+ const auto &ST = CurMF->getSubtarget ();
291
+ constrainSelectedInstRegOperands (
292
+ *MIB, *ST.getInstrInfo (), *ST.getRegisterInfo (), *ST.getRegBankInfo ());
293
+ return MIB;
294
+ });
290
295
return Res;
291
296
}
292
297
@@ -305,21 +310,25 @@ Register SPIRVGlobalRegistry::getOrCreateConstInt(uint64_t Val, MachineInstr &I,
305
310
// machine instruction, a new constant instruction should be created.
306
311
if (!New && (!I.getOperand (0 ).isReg () || Res != I.getOperand (0 ).getReg ()))
307
312
return Res;
308
- MachineInstrBuilder MIB;
309
- MachineBasicBlock &BB = *I.getParent ();
310
- if (Val || !ZeroAsNull) {
311
- MIB = BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpConstantI))
312
- .addDef (Res)
313
- .addUse (getSPIRVTypeID (SpvType));
314
- addNumImm (APInt (BitWidth, Val), MIB);
315
- } else {
316
- MIB = BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpConstantNull))
317
- .addDef (Res)
318
- .addUse (getSPIRVTypeID (SpvType));
319
- }
320
- const auto &ST = CurMF->getSubtarget ();
321
- constrainSelectedInstRegOperands (*MIB, *ST.getInstrInfo (),
322
- *ST.getRegisterInfo (), *ST.getRegBankInfo ());
313
+
314
+ MachineIRBuilder MIRBuilder (I);
315
+ createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
316
+ MachineInstrBuilder MIB;
317
+ if (Val || !ZeroAsNull) {
318
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantI)
319
+ .addDef (Res)
320
+ .addUse (getSPIRVTypeID (SpvType));
321
+ addNumImm (APInt (BitWidth, Val), MIB);
322
+ } else {
323
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantNull)
324
+ .addDef (Res)
325
+ .addUse (getSPIRVTypeID (SpvType));
326
+ }
327
+ const auto &ST = CurMF->getSubtarget ();
328
+ constrainSelectedInstRegOperands (
329
+ *MIB, *ST.getInstrInfo (), *ST.getRegisterInfo (), *ST.getRegBankInfo ());
330
+ return MIB;
331
+ });
323
332
return Res;
324
333
}
325
334
@@ -347,21 +356,24 @@ Register SPIRVGlobalRegistry::buildConstantInt(uint64_t Val,
347
356
MIRBuilder.buildConstant (Res, *ConstInt);
348
357
} else {
349
358
Register SpvTypeReg = getSPIRVTypeID (SpvType);
350
- MachineInstrBuilder MIB;
351
- if (Val || !ZeroAsNull) {
352
- MIB = MIRBuilder.buildInstr (SPIRV::OpConstantI)
353
- .addDef (Res)
354
- .addUse (SpvTypeReg);
355
- addNumImm (APInt (BitWidth, Val), MIB);
356
- } else {
357
- MIB = MIRBuilder.buildInstr (SPIRV::OpConstantNull)
358
- .addDef (Res)
359
- .addUse (SpvTypeReg);
360
- }
361
- const auto &Subtarget = CurMF->getSubtarget ();
362
- constrainSelectedInstRegOperands (*MIB, *Subtarget.getInstrInfo (),
363
- *Subtarget.getRegisterInfo (),
364
- *Subtarget.getRegBankInfo ());
359
+ createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
360
+ MachineInstrBuilder MIB;
361
+ if (Val || !ZeroAsNull) {
362
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantI)
363
+ .addDef (Res)
364
+ .addUse (SpvTypeReg);
365
+ addNumImm (APInt (BitWidth, Val), MIB);
366
+ } else {
367
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantNull)
368
+ .addDef (Res)
369
+ .addUse (SpvTypeReg);
370
+ }
371
+ const auto &Subtarget = CurMF->getSubtarget ();
372
+ constrainSelectedInstRegOperands (*MIB, *Subtarget.getInstrInfo (),
373
+ *Subtarget.getRegisterInfo (),
374
+ *Subtarget.getRegBankInfo ());
375
+ return MIB;
376
+ });
365
377
}
366
378
}
367
379
return Res;
@@ -385,12 +397,14 @@ Register SPIRVGlobalRegistry::buildConstantFP(APFloat Val,
385
397
MF.getRegInfo ().setRegClass (Res, &SPIRV::fIDRegClass );
386
398
assignSPIRVTypeToVReg (SpvType, Res, MF);
387
399
DT.add (ConstFP, &MF, Res);
388
-
389
- MachineInstrBuilder MIB;
390
- MIB = MIRBuilder.buildInstr (SPIRV::OpConstantF)
391
- .addDef (Res)
392
- .addUse (getSPIRVTypeID (SpvType));
393
- addNumImm (ConstFP->getValueAPF ().bitcastToAPInt (), MIB);
400
+ createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
401
+ MachineInstrBuilder MIB;
402
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantF)
403
+ .addDef (Res)
404
+ .addUse (getSPIRVTypeID (SpvType));
405
+ addNumImm (ConstFP->getValueAPF ().bitcastToAPInt (), MIB);
406
+ return MIB;
407
+ });
394
408
}
395
409
396
410
return Res;
@@ -439,23 +453,26 @@ Register SPIRVGlobalRegistry::getOrCreateCompositeOrNull(
439
453
CurMF->getRegInfo ().setRegClass (SpvVecConst, getRegClass (SpvType));
440
454
assignSPIRVTypeToVReg (SpvType, SpvVecConst, *CurMF);
441
455
DT.add (CA, CurMF, SpvVecConst);
442
- MachineInstrBuilder MIB;
443
- MachineBasicBlock &BB = *I.getParent ();
444
- if (!IsNull) {
445
- MIB = BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpConstantComposite))
446
- .addDef (SpvVecConst)
447
- .addUse (getSPIRVTypeID (SpvType));
448
- for (unsigned i = 0 ; i < ElemCnt; ++i)
449
- MIB.addUse (SpvScalConst);
450
- } else {
451
- MIB = BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpConstantNull))
452
- .addDef (SpvVecConst)
453
- .addUse (getSPIRVTypeID (SpvType));
454
- }
455
- const auto &Subtarget = CurMF->getSubtarget ();
456
- constrainSelectedInstRegOperands (*MIB, *Subtarget.getInstrInfo (),
457
- *Subtarget.getRegisterInfo (),
458
- *Subtarget.getRegBankInfo ());
456
+ MachineIRBuilder MIRBuilder (I);
457
+ createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
458
+ MachineInstrBuilder MIB;
459
+ if (!IsNull) {
460
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantComposite)
461
+ .addDef (SpvVecConst)
462
+ .addUse (getSPIRVTypeID (SpvType));
463
+ for (unsigned i = 0 ; i < ElemCnt; ++i)
464
+ MIB.addUse (SpvScalConst);
465
+ } else {
466
+ MIB = MIRBuilder.buildInstr (SPIRV::OpConstantNull)
467
+ .addDef (SpvVecConst)
468
+ .addUse (getSPIRVTypeID (SpvType));
469
+ }
470
+ const auto &Subtarget = CurMF->getSubtarget ();
471
+ constrainSelectedInstRegOperands (*MIB, *Subtarget.getInstrInfo (),
472
+ *Subtarget.getRegisterInfo (),
473
+ *Subtarget.getRegBankInfo ());
474
+ return MIB;
475
+ });
459
476
return SpvVecConst;
460
477
}
461
478
return Res;
@@ -544,17 +561,20 @@ Register SPIRVGlobalRegistry::getOrCreateIntCompositeOrNull(
544
561
if (EmitIR) {
545
562
MIRBuilder.buildSplatBuildVector (SpvVecConst, SpvScalConst);
546
563
} else {
547
- if (Val) {
548
- auto MIB = MIRBuilder.buildInstr (SPIRV::OpConstantComposite)
549
- .addDef (SpvVecConst)
550
- .addUse (getSPIRVTypeID (SpvType));
551
- for (unsigned i = 0 ; i < ElemCnt; ++i)
552
- MIB.addUse (SpvScalConst);
553
- } else {
554
- MIRBuilder.buildInstr (SPIRV::OpConstantNull)
555
- .addDef (SpvVecConst)
556
- .addUse (getSPIRVTypeID (SpvType));
557
- }
564
+ createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
565
+ if (Val) {
566
+ auto MIB = MIRBuilder.buildInstr (SPIRV::OpConstantComposite)
567
+ .addDef (SpvVecConst)
568
+ .addUse (getSPIRVTypeID (SpvType));
569
+ for (unsigned i = 0 ; i < ElemCnt; ++i)
570
+ MIB.addUse (SpvScalConst);
571
+ return MIB;
572
+ } else {
573
+ return MIRBuilder.buildInstr (SPIRV::OpConstantNull)
574
+ .addDef (SpvVecConst)
575
+ .addUse (getSPIRVTypeID (SpvType));
576
+ }
577
+ });
558
578
}
559
579
return SpvVecConst;
560
580
}
@@ -592,9 +612,11 @@ SPIRVGlobalRegistry::getOrCreateConstNullPtr(MachineIRBuilder &MIRBuilder,
592
612
Res = CurMF->getRegInfo ().createGenericVirtualRegister (LLTy);
593
613
CurMF->getRegInfo ().setRegClass (Res, &SPIRV::pIDRegClass);
594
614
assignSPIRVTypeToVReg (SpvType, Res, *CurMF);
595
- MIRBuilder.buildInstr (SPIRV::OpConstantNull)
596
- .addDef (Res)
597
- .addUse (getSPIRVTypeID (SpvType));
615
+ createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
616
+ return MIRBuilder.buildInstr (SPIRV::OpConstantNull)
617
+ .addDef (Res)
618
+ .addUse (getSPIRVTypeID (SpvType));
619
+ });
598
620
DT.add (CP, CurMF, Res);
599
621
}
600
622
return Res;
@@ -614,12 +636,14 @@ Register SPIRVGlobalRegistry::buildConstantSampler(
614
636
ResReg.isValid ()
615
637
? ResReg
616
638
: MIRBuilder.getMRI ()->createVirtualRegister (&SPIRV::iIDRegClass);
617
- auto Res = MIRBuilder.buildInstr (SPIRV::OpConstantSampler)
618
- .addDef (Sampler)
619
- .addUse (getSPIRVTypeID (SampTy))
620
- .addImm (AddrMode)
621
- .addImm (Param)
622
- .addImm (FilerMode);
639
+ auto Res = createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
640
+ return MIRBuilder.buildInstr (SPIRV::OpConstantSampler)
641
+ .addDef (Sampler)
642
+ .addUse (getSPIRVTypeID (SampTy))
643
+ .addImm (AddrMode)
644
+ .addImm (Param)
645
+ .addImm (FilerMode);
646
+ });
623
647
assert (Res->getOperand (0 ).isReg ());
624
648
return Res->getOperand (0 ).getReg ();
625
649
}
@@ -1551,14 +1575,17 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(
1551
1575
if (Reg.isValid ())
1552
1576
return getSPIRVTypeForVReg (Reg);
1553
1577
// create a new type
1554
- auto MIB = BuildMI (MIRBuilder.getMBB (), MIRBuilder.getInsertPt (),
1555
- MIRBuilder.getDebugLoc (),
1556
- MIRBuilder.getTII ().get (SPIRV::OpTypePointer))
1557
- .addDef (createTypeVReg (CurMF->getRegInfo ()))
1558
- .addImm (static_cast <uint32_t >(SC))
1559
- .addUse (getSPIRVTypeID (BaseType));
1560
- DT.add (PointerElementType, AddressSpace, CurMF, getSPIRVTypeID (MIB));
1561
- return finishCreatingSPIRVType (LLVMTy, MIB);
1578
+ return createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
1579
+ auto MIB = BuildMI (MIRBuilder.getMBB (), MIRBuilder.getInsertPt (),
1580
+ MIRBuilder.getDebugLoc (),
1581
+ MIRBuilder.getTII ().get (SPIRV::OpTypePointer))
1582
+ .addDef (createTypeVReg (CurMF->getRegInfo ()))
1583
+ .addImm (static_cast <uint32_t >(SC))
1584
+ .addUse (getSPIRVTypeID (BaseType));
1585
+ DT.add (PointerElementType, AddressSpace, CurMF, getSPIRVTypeID (MIB));
1586
+ finishCreatingSPIRVType (LLVMTy, MIB);
1587
+ return MIB;
1588
+ });
1562
1589
}
1563
1590
1564
1591
SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVPointerType (
0 commit comments