@@ -317,8 +317,9 @@ bool AMDGPUInstructionSelector::selectG_INTRINSIC(MachineInstr &I,
317
317
return false ;
318
318
}
319
319
320
- static unsigned getV_CMPOpcode (CmpInst::Predicate P, unsigned Size) {
321
- assert (Size == 32 || Size == 64 );
320
+ static int getV_CMPOpcode (CmpInst::Predicate P, unsigned Size) {
321
+ if (Size != 32 && Size != 64 )
322
+ return -1 ;
322
323
switch (P) {
323
324
default :
324
325
llvm_unreachable (" Unknown condition code!" );
@@ -345,12 +346,26 @@ static unsigned getV_CMPOpcode(CmpInst::Predicate P, unsigned Size) {
345
346
}
346
347
}
347
348
348
- static unsigned getS_CMPOpcode (CmpInst::Predicate P, unsigned Size) {
349
- // FIXME: VI supports 64-bit comparse.
350
- assert (Size == 32 );
349
+ int AMDGPUInstructionSelector::getS_CMPOpcode (CmpInst::Predicate P,
350
+ unsigned Size) const {
351
+ if (Size == 64 ) {
352
+ if (!STI.hasScalarCompareEq64 ())
353
+ return -1 ;
354
+
355
+ switch (P) {
356
+ case CmpInst::ICMP_NE:
357
+ return AMDGPU::S_CMP_LG_U64;
358
+ case CmpInst::ICMP_EQ:
359
+ return AMDGPU::S_CMP_EQ_U64;
360
+ default :
361
+ return -1 ;
362
+ }
363
+ }
364
+
365
+ if (Size != 32 )
366
+ return -1 ;
367
+
351
368
switch (P) {
352
- default :
353
- llvm_unreachable (" Unknown condition code!" );
354
369
case CmpInst::ICMP_NE:
355
370
return AMDGPU::S_CMP_LG_U32;
356
371
case CmpInst::ICMP_EQ:
@@ -371,6 +386,8 @@ static unsigned getS_CMPOpcode(CmpInst::Predicate P, unsigned Size) {
371
386
return AMDGPU::S_CMP_LT_U32;
372
387
case CmpInst::ICMP_ULE:
373
388
return AMDGPU::S_CMP_LE_U32;
389
+ default :
390
+ llvm_unreachable (" Unknown condition code!" );
374
391
}
375
392
}
376
393
@@ -382,12 +399,14 @@ bool AMDGPUInstructionSelector::selectG_ICMP(MachineInstr &I) const {
382
399
383
400
unsigned SrcReg = I.getOperand (2 ).getReg ();
384
401
unsigned Size = RBI.getSizeInBits (SrcReg, MRI, TRI);
385
- // FIXME: VI supports 64-bit compares.
386
- assert (Size == 32 );
402
+
403
+ auto Pred = (CmpInst::Predicate)I. getOperand ( 1 ). getPredicate ( );
387
404
388
405
unsigned CCReg = I.getOperand (0 ).getReg ();
389
406
if (isSCC (CCReg, MRI)) {
390
- unsigned Opcode = getS_CMPOpcode ((CmpInst::Predicate)I.getOperand (1 ).getPredicate (), Size);
407
+ int Opcode = getS_CMPOpcode (Pred, Size);
408
+ if (Opcode == -1 )
409
+ return false ;
391
410
MachineInstr *ICmp = BuildMI (*BB, &I, DL, TII.get (Opcode))
392
411
.add (I.getOperand (2 ))
393
412
.add (I.getOperand (3 ));
@@ -400,8 +419,10 @@ bool AMDGPUInstructionSelector::selectG_ICMP(MachineInstr &I) const {
400
419
return Ret;
401
420
}
402
421
403
- assert (Size == 32 || Size == 64 );
404
- unsigned Opcode = getV_CMPOpcode ((CmpInst::Predicate)I.getOperand (1 ).getPredicate (), Size);
422
+ int Opcode = getV_CMPOpcode (Pred, Size);
423
+ if (Opcode == -1 )
424
+ return false ;
425
+
405
426
MachineInstr *ICmp = BuildMI (*BB, &I, DL, TII.get (Opcode),
406
427
I.getOperand (0 ).getReg ())
407
428
.add (I.getOperand (2 ))
@@ -984,7 +1005,9 @@ bool AMDGPUInstructionSelector::select(MachineInstr &I,
984
1005
case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
985
1006
return selectG_INTRINSIC_W_SIDE_EFFECTS (I, CoverageInfo);
986
1007
case TargetOpcode::G_ICMP:
987
- return selectG_ICMP (I);
1008
+ if (selectG_ICMP (I))
1009
+ return true ;
1010
+ return selectImpl (I, CoverageInfo);
988
1011
case TargetOpcode::G_LOAD:
989
1012
if (selectImpl (I, CoverageInfo))
990
1013
return true ;
0 commit comments