Skip to content

Commit fcd086c

Browse files
committed
[X86] canCreateUndefOrPoisonForTargetNode - SSE vector shifts handle out of bounds shift amounts
SHL/SRL are guaranteed to fold to zero, SRA is guaranteed to fold to 'all sign bits'
1 parent 2171f34 commit fcd086c

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42930,7 +42930,6 @@ bool X86TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode(
4293042930
bool PoisonOnly, unsigned Depth) const {
4293142931
unsigned NumElts = DemandedElts.getBitWidth();
4293242932

42933-
// TODO: Add more target shuffles.
4293442933
switch (Op.getOpcode()) {
4293542934
case X86ISD::PSHUFD:
4293642935
case X86ISD::VPERMILPI: {
@@ -42966,8 +42965,12 @@ bool X86TargetLowering::canCreateUndefOrPoisonForTargetNode(
4296642965
SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4296742966
bool PoisonOnly, bool ConsiderFlags, unsigned Depth) const {
4296842967

42969-
// TODO: Add more target shuffles.
4297042968
switch (Op.getOpcode()) {
42969+
// SSE vector shifts handle out of bounds shift amounts.
42970+
case X86ISD::VSHLI:
42971+
case X86ISD::VSRLI:
42972+
case X86ISD::VSRAI:
42973+
return false;
4297142974
case X86ISD::PSHUFD:
4297242975
case X86ISD::VPERMILPI:
4297342976
case X86ISD::UNPCKH:

llvm/test/CodeGen/X86/freeze-binary.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -546,9 +546,8 @@ define <8 x i16> @freeze_ashr_vec(<8 x i16> %a0) nounwind {
546546
define <4 x i32> @freeze_ashr_vec_outofrange(<4 x i32> %a0) nounwind {
547547
; X86-LABEL: freeze_ashr_vec_outofrange:
548548
; X86: # %bb.0:
549-
; X86-NEXT: psrad $1, %xmm0
550549
; X86-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,2,3]
551-
; X86-NEXT: psrad $2, %xmm0
550+
; X86-NEXT: psrad $3, %xmm0
552551
; X86-NEXT: retl
553552
;
554553
; X64-LABEL: freeze_ashr_vec_outofrange:
@@ -660,9 +659,8 @@ define <8 x i16> @freeze_lshr_vec(<8 x i16> %a0) nounwind {
660659
define <4 x i32> @freeze_lshr_vec_outofrange(<4 x i32> %a0) nounwind {
661660
; X86-LABEL: freeze_lshr_vec_outofrange:
662661
; X86: # %bb.0:
663-
; X86-NEXT: psrld $1, %xmm0
664662
; X86-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,2,3]
665-
; X86-NEXT: psrld $2, %xmm0
663+
; X86-NEXT: psrld $3, %xmm0
666664
; X86-NEXT: retl
667665
;
668666
; X64-LABEL: freeze_lshr_vec_outofrange:

0 commit comments

Comments
 (0)