Skip to content

Commit 4fb69a7

Browse files
committed
AMDGPU: Handle brev and not cases in getConstValDefinedInReg
We should not encounter these cases in the peephole-opt use today, but get the common helper function to handle these.
1 parent 91b6a4a commit 4fb69a7

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,8 +1330,6 @@ Register SIInstrInfo::insertNE(MachineBasicBlock *MBB,
13301330
bool SIInstrInfo::getConstValDefinedInReg(const MachineInstr &MI,
13311331
const Register Reg,
13321332
int64_t &ImmVal) const {
1333-
// TODO: Handle all the special cases handled in SIShrinkInstructions
1334-
// (e.g. s_brev_b32 imm -> reverse(imm))
13351333
switch (MI.getOpcode()) {
13361334
case AMDGPU::V_MOV_B32_e32:
13371335
case AMDGPU::S_MOV_B32:
@@ -1349,6 +1347,28 @@ bool SIInstrInfo::getConstValDefinedInReg(const MachineInstr &MI,
13491347

13501348
return false;
13511349
}
1350+
case AMDGPU::S_BREV_B32:
1351+
case AMDGPU::V_BFREV_B32_e32:
1352+
case AMDGPU::V_BFREV_B32_e64: {
1353+
const MachineOperand &Src0 = MI.getOperand(1);
1354+
if (Src0.isImm()) {
1355+
ImmVal = static_cast<int64_t>(reverseBits<int32_t>(Src0.getImm()));
1356+
return MI.getOperand(0).getReg() == Reg;
1357+
}
1358+
1359+
return false;
1360+
}
1361+
case AMDGPU::S_NOT_B32:
1362+
case AMDGPU::V_NOT_B32_e32:
1363+
case AMDGPU::V_NOT_B32_e64: {
1364+
const MachineOperand &Src0 = MI.getOperand(1);
1365+
if (Src0.isImm()) {
1366+
ImmVal = static_cast<int64_t>(~static_cast<int32_t>(Src0.getImm()));
1367+
return MI.getOperand(0).getReg() == Reg;
1368+
}
1369+
1370+
return false;
1371+
}
13521372
default:
13531373
return false;
13541374
}

llvm/test/CodeGen/AMDGPU/peephole-fold-imm.mir

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ body: |
451451
452452
; GCN-LABEL: name: fold_s_brev_b32_simm_virtual_0
453453
; GCN: [[S_BREV_B32_:%[0-9]+]]:sreg_32 = S_BREV_B32 1
454-
; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY killed [[S_BREV_B32_]]
454+
; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 -2147483648
455455
; GCN-NEXT: SI_RETURN_TO_EPILOG
456456
%0:sreg_32 = S_BREV_B32 1
457457
%1:sreg_32 = COPY killed %0
@@ -466,7 +466,7 @@ body: |
466466
467467
; GCN-LABEL: name: fold_s_brev_b32_simm_virtual_1
468468
; GCN: [[S_BREV_B32_:%[0-9]+]]:sreg_32 = S_BREV_B32 -64
469-
; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY killed [[S_BREV_B32_]]
469+
; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 67108863
470470
; GCN-NEXT: SI_RETURN_TO_EPILOG
471471
%0:sreg_32 = S_BREV_B32 -64
472472
%1:sreg_32 = COPY killed %0
@@ -481,8 +481,8 @@ body: |
481481
482482
; GCN-LABEL: name: fold_v_bfrev_b32_e32_imm
483483
; GCN: [[V_BFREV_B32_e32_:%[0-9]+]]:vgpr_32 = V_BFREV_B32_e32 1, implicit $exec
484-
; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed [[V_BFREV_B32_e32_]]
485-
; GCN-NEXT: SI_RETURN_TO_EPILOG [[COPY]]
484+
; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 -2147483648, implicit $exec
485+
; GCN-NEXT: SI_RETURN_TO_EPILOG [[V_MOV_B32_e32_]]
486486
%0:vgpr_32 = V_BFREV_B32_e32 1, implicit $exec
487487
%1:vgpr_32 = COPY killed %0
488488
SI_RETURN_TO_EPILOG %1
@@ -496,8 +496,8 @@ body: |
496496
497497
; GCN-LABEL: name: fold_v_bfrev_b32_e64_imm
498498
; GCN: [[V_BFREV_B32_e64_:%[0-9]+]]:vgpr_32 = V_BFREV_B32_e64 1, implicit $exec
499-
; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed [[V_BFREV_B32_e64_]]
500-
; GCN-NEXT: SI_RETURN_TO_EPILOG [[COPY]]
499+
; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 -2147483648, implicit $exec
500+
; GCN-NEXT: SI_RETURN_TO_EPILOG [[V_MOV_B32_e32_]]
501501
%0:vgpr_32 = V_BFREV_B32_e64 1, implicit $exec
502502
%1:vgpr_32 = COPY killed %0
503503
SI_RETURN_TO_EPILOG %1
@@ -511,7 +511,7 @@ body: |
511511
512512
; GCN-LABEL: name: fold_s_not_b32_simm_virtual_0
513513
; GCN: [[S_NOT_B32_:%[0-9]+]]:sreg_32 = S_NOT_B32 1, implicit-def $scc
514-
; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY killed [[S_NOT_B32_]]
514+
; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 -2
515515
; GCN-NEXT: SI_RETURN_TO_EPILOG
516516
%0:sreg_32 = S_NOT_B32 1, implicit-def $scc
517517
%1:sreg_32 = COPY killed %0
@@ -526,7 +526,7 @@ body: |
526526
527527
; GCN-LABEL: name: fold_s_not_b32_simm_virtual_1
528528
; GCN: [[S_NOT_B32_:%[0-9]+]]:sreg_32 = S_NOT_B32 -64, implicit-def $scc
529-
; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY killed [[S_NOT_B32_]]
529+
; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 63
530530
; GCN-NEXT: SI_RETURN_TO_EPILOG
531531
%0:sreg_32 = S_NOT_B32 -64, implicit-def $scc
532532
%1:sreg_32 = COPY killed %0
@@ -541,8 +541,8 @@ body: |
541541
542542
; GCN-LABEL: name: fold_v_not_b32_e32_imm
543543
; GCN: [[V_NOT_B32_e32_:%[0-9]+]]:vgpr_32 = V_NOT_B32_e32 1, implicit $exec
544-
; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed [[V_NOT_B32_e32_]]
545-
; GCN-NEXT: SI_RETURN_TO_EPILOG [[COPY]]
544+
; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 -2, implicit $exec
545+
; GCN-NEXT: SI_RETURN_TO_EPILOG [[V_MOV_B32_e32_]]
546546
%0:vgpr_32 = V_NOT_B32_e32 1, implicit $exec
547547
%1:vgpr_32 = COPY killed %0
548548
SI_RETURN_TO_EPILOG %1
@@ -556,8 +556,8 @@ body: |
556556
557557
; GCN-LABEL: name: fold_v_not_b32_e64_imm
558558
; GCN: [[V_NOT_B32_e64_:%[0-9]+]]:vgpr_32 = V_NOT_B32_e64 1, implicit $exec
559-
; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed [[V_NOT_B32_e64_]]
560-
; GCN-NEXT: SI_RETURN_TO_EPILOG [[COPY]]
559+
; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 -2, implicit $exec
560+
; GCN-NEXT: SI_RETURN_TO_EPILOG [[V_MOV_B32_e32_]]
561561
%0:vgpr_32 = V_NOT_B32_e64 1, implicit $exec
562562
%1:vgpr_32 = COPY killed %0
563563
SI_RETURN_TO_EPILOG %1

0 commit comments

Comments
 (0)