From: Simon Pilgrim Date: Fri, 12 Jun 2020 13:46:18 +0000 (+0100) Subject: [DAG] foldAddSubOfSignBit - add support for non-uniform vector constants X-Git-Tag: llvmorg-12-init~3268 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5509e2cc2ea1ed4018d6e2679e113429717f158d;p=platform%2Fupstream%2Fllvm.git [DAG] foldAddSubOfSignBit - add support for non-uniform vector constants --- diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 1352a7d..7b278ad 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2079,12 +2079,11 @@ static SDValue foldAddSubOfSignBit(SDNode *N, SelectionDAG &DAG) { // We need a constant operand for the add/sub, and the other operand is a // logical shift right: add (srl), C or sub C, (srl). - // TODO - support non-uniform vector amounts. bool IsAdd = N->getOpcode() == ISD::ADD; SDValue ConstantOp = IsAdd ? N->getOperand(1) : N->getOperand(0); SDValue ShiftOp = IsAdd ? N->getOperand(0) : N->getOperand(1); - ConstantSDNode *C = isConstOrConstSplat(ConstantOp); - if (!C || ShiftOp.getOpcode() != ISD::SRL) + if (!DAG.isConstantIntBuildVectorOrConstantInt(ConstantOp) || + ShiftOp.getOpcode() != ISD::SRL) return SDValue(); // The shift must be of a 'not' value. @@ -2105,8 +2104,11 @@ static SDValue foldAddSubOfSignBit(SDNode *N, SelectionDAG &DAG) { SDLoc DL(N); auto ShOpcode = IsAdd ? ISD::SRA : ISD::SRL; SDValue NewShift = DAG.getNode(ShOpcode, DL, VT, Not.getOperand(0), ShAmt); - APInt NewC = IsAdd ? C->getAPIntValue() + 1 : C->getAPIntValue() - 1; - return DAG.getNode(ISD::ADD, DL, VT, NewShift, DAG.getConstant(NewC, DL, VT)); + if (SDValue NewC = + DAG.FoldConstantArithmetic(IsAdd ? ISD::ADD : ISD::SUB, DL, VT, + {ConstantOp, DAG.getConstant(1, DL, VT)})) + return DAG.getNode(ISD::ADD, DL, VT, NewShift, NewC); + return SDValue(); } /// Try to fold a node that behaves like an ADD (note that N isn't necessarily diff --git a/llvm/test/CodeGen/X86/signbit-shift.ll b/llvm/test/CodeGen/X86/signbit-shift.ll index 50342ee..45a2bec 100644 --- a/llvm/test/CodeGen/X86/signbit-shift.ll +++ b/llvm/test/CodeGen/X86/signbit-shift.ll @@ -235,9 +235,7 @@ define <4 x i32> @add_lshr_not_vec_splat(<4 x i32> %x) { define <4 x i32> @add_lshr_not_vec_nonsplat(<4 x i32> %x) { ; CHECK-LABEL: add_lshr_not_vec_nonsplat: ; CHECK: # %bb.0: -; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 -; CHECK-NEXT: pxor %xmm1, %xmm0 -; CHECK-NEXT: psrld $31, %xmm0 +; CHECK-NEXT: psrad $31, %xmm0 ; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq %c = xor <4 x i32> %x, @@ -274,9 +272,7 @@ define <4 x i32> @sub_lshr_not_vec_splat(<4 x i32> %x) { define <4 x i32> @sub_lshr_not_vec_nonsplat(<4 x i32> %x) { ; CHECK-LABEL: sub_lshr_not_vec_nonsplat: ; CHECK: # %bb.0: -; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 -; CHECK-NEXT: pxor %xmm1, %xmm0 -; CHECK-NEXT: psrad $31, %xmm0 +; CHECK-NEXT: psrld $31, %xmm0 ; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq %c = xor <4 x i32> %x,