From: Simon Pilgrim Date: Thu, 6 Apr 2023 12:35:45 +0000 (+0100) Subject: [DAG] combineSelect - select(i1,vXi1,vXi1) - only cast constants to iX pre... X-Git-Tag: upstream/17.0.6~12428 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=846712b0cb133f0ebfaf5be41818183b4c86f0a1;p=platform%2Fupstream%2Fllvm.git [DAG] combineSelect - select(i1,vXi1,vXi1) - only cast constants to iX pre-legalization or if its a legal type Fixes #61524 --- diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index dc07a03..88495d8 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -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); + } } } diff --git a/llvm/test/CodeGen/X86/pr61524.ll b/llvm/test/CodeGen/X86/pr61524.ll new file mode 100644 index 0000000..0f4ccd6 --- /dev/null +++ b/llvm/test/CodeGen/X86/pr61524.ll @@ -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> , <3 x i1> zeroinitializer + ret <3 x i1> %select +}