Skip to content

Commit

Permalink
[DAG] combineSelect - select(i1,vXi1,vXi1) - only cast <X x i1> const…
Browse files Browse the repository at this point in the history
…ants to iX pre-legalization or if its a legal type

Fixes #61524
  • Loading branch information
RKSimon committed Apr 6, 2023
1 parent 5348a25 commit 846712b
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 19 deletions.
38 changes: 19 additions & 19 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46812,27 +46812,27 @@ static SDValue combineSelect(SDNode *N, SelectionDAG &DAG,
VT.getVectorElementType() == MVT::i1 &&
(DCI.isBeforeLegalize() || (VT != MVT::v64i1 || Subtarget.is64Bit()))) {
EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), VT.getVectorNumElements());
bool LHSIsConst = ISD::isBuildVectorOfConstantSDNodes(LHS.getNode());
bool RHSIsConst = ISD::isBuildVectorOfConstantSDNodes(RHS.getNode());

if ((LHSIsConst ||
(LHS.getOpcode() == ISD::BITCAST &&
LHS.getOperand(0).getValueType() == IntVT)) &&
(RHSIsConst ||
(RHS.getOpcode() == ISD::BITCAST &&
RHS.getOperand(0).getValueType() == IntVT))) {
if (LHSIsConst)
LHS = combinevXi1ConstantToInteger(LHS, DAG);
else
LHS = LHS.getOperand(0);
if (DCI.isBeforeLegalize() || TLI.isTypeLegal(IntVT)) {
bool LHSIsConst = ISD::isBuildVectorOfConstantSDNodes(LHS.getNode());
bool RHSIsConst = ISD::isBuildVectorOfConstantSDNodes(RHS.getNode());

if ((LHSIsConst || (LHS.getOpcode() == ISD::BITCAST &&
LHS.getOperand(0).getValueType() == IntVT)) &&
(RHSIsConst || (RHS.getOpcode() == ISD::BITCAST &&
RHS.getOperand(0).getValueType() == IntVT))) {
if (LHSIsConst)
LHS = combinevXi1ConstantToInteger(LHS, DAG);
else
LHS = LHS.getOperand(0);

if (RHSIsConst)
RHS = combinevXi1ConstantToInteger(RHS, DAG);
else
RHS = RHS.getOperand(0);
if (RHSIsConst)
RHS = combinevXi1ConstantToInteger(RHS, DAG);
else
RHS = RHS.getOperand(0);

SDValue Select = DAG.getSelect(DL, IntVT, Cond, LHS, RHS);
return DAG.getBitcast(VT, Select);
SDValue Select = DAG.getSelect(DL, IntVT, Cond, LHS, RHS);
return DAG.getBitcast(VT, Select);
}
}
}

Expand Down
26 changes: 26 additions & 0 deletions llvm/test/CodeGen/X86/pr61524.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s --mtriple=x86_64-- -mcpu=cascadelake | FileCheck %s

define <3 x i1> @repro(i1 %cond) {
; CHECK-LABEL: repro:
; CHECK: # %bb.0:
; CHECK-NEXT: testb $1, %dil
; CHECK-NEXT: jne .LBB0_1
; CHECK-NEXT: # %bb.2:
; CHECK-NEXT: kxorw %k0, %k0, %k0
; CHECK-NEXT: jmp .LBB0_3
; CHECK-NEXT: .LBB0_1:
; CHECK-NEXT: kxnorw %k0, %k0, %k0
; CHECK-NEXT: .LBB0_3:
; CHECK-NEXT: kshiftrb $1, %k0, %k1
; CHECK-NEXT: kmovd %k1, %edx
; CHECK-NEXT: kshiftrb $2, %k0, %k1
; CHECK-NEXT: kmovd %k1, %ecx
; CHECK-NEXT: kmovd %k0, %eax
; CHECK-NEXT: # kill: def $al killed $al killed $eax
; CHECK-NEXT: # kill: def $dl killed $dl killed $edx
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
; CHECK-NEXT: retq
%select = select i1 %cond, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> zeroinitializer
ret <3 x i1> %select
}

0 comments on commit 846712b

Please sign in to comment.