Skip to content

Commit e5b8c24

Browse files
authored
[DAG] Add ComputeNumSignBits(FREEZE(X)) handling (#161507)
If X is known never under/poison then skip the freeze and return ComputeNumSignBits(X)
1 parent a4767e6 commit e5b8c24

File tree

2 files changed

+5
-6
lines changed

2 files changed

+5
-6
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4762,6 +4762,11 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
47624762
case ISD::AssertZext:
47634763
Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
47644764
return VTBits-Tmp;
4765+
case ISD::FREEZE:
4766+
if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4767+
/*PoisonOnly=*/false))
4768+
return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4769+
break;
47654770
case ISD::MERGE_VALUES:
47664771
return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
47674772
Depth + 1);

llvm/test/CodeGen/AArch64/freeze.ll

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -466,15 +466,12 @@ define <8 x i16> @freeze_urhadd(<8 x i16> %a0, <8 x i16> %a1) {
466466
ret <8 x i16> %masked
467467
}
468468

469-
; TODO: Unnecessary sext_inreg
470469
define <8 x i16> @freeze_shadd(<8 x i8> %a0, <8 x i16> %a1) {
471470
; CHECK-LABEL: freeze_shadd:
472471
; CHECK: // %bb.0:
473472
; CHECK-NEXT: sshll v0.8h, v0.8b, #0
474473
; CHECK-NEXT: sshr v1.8h, v1.8h, #8
475474
; CHECK-NEXT: shadd v0.8h, v0.8h, v1.8h
476-
; CHECK-NEXT: shl v0.8h, v0.8h, #8
477-
; CHECK-NEXT: sshr v0.8h, v0.8h, #8
478475
; CHECK-NEXT: ret
479476
%x0 = sext <8 x i8> %a0 to <8 x i16>
480477
%x1 = ashr <8 x i16> %a1, splat (i16 8)
@@ -485,15 +482,12 @@ define <8 x i16> @freeze_shadd(<8 x i8> %a0, <8 x i16> %a1) {
485482
ret <8 x i16> %sext
486483
}
487484

488-
; TODO: Unnecessary sext_inreg
489485
define <8 x i16> @freeze_srhadd(<8 x i8> %a0, <8 x i16> %a1) {
490486
; CHECK-LABEL: freeze_srhadd:
491487
; CHECK: // %bb.0:
492488
; CHECK-NEXT: sshll v0.8h, v0.8b, #0
493489
; CHECK-NEXT: sshr v1.8h, v1.8h, #8
494490
; CHECK-NEXT: srhadd v0.8h, v0.8h, v1.8h
495-
; CHECK-NEXT: shl v0.8h, v0.8h, #8
496-
; CHECK-NEXT: sshr v0.8h, v0.8h, #8
497491
; CHECK-NEXT: ret
498492
%x0 = sext <8 x i8> %a0 to <8 x i16>
499493
%x1 = ashr <8 x i16> %a1, splat (i16 8)

0 commit comments

Comments
 (0)