[llvm] r318706 - [SelectionDAG] When promoting the result of a VSELECT, make sure we promote the condition to the SetCC type for the final result type not the original type.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 20 15:08:50 PST 2017


Author: ctopper
Date: Mon Nov 20 15:08:50 2017
New Revision: 318706

URL: http://llvm.org/viewvc/llvm-project?rev=318706&view=rev
Log:
[SelectionDAG] When promoting the result of a VSELECT, make sure we promote the condition to the SetCC type for the final result type not the original type.

Normally this would be cleaned up by promoting the condition operand next. But in the attached case we promoted the result from v2i48 to v2i64 and the condition from v2i1 to v2i48. Then we tried to "promote" the v2i48 condition back to v2i1 because that's what the SetCC result type for v2i64 is on X86 with VLX. But promote is either a NOP or SIGN_EXTEND and this would need a truncation.

With the change here we now get the SetCC type of v2i1 when we're handling the result promotion and the operand no longer needs to be promoted itself.

Fixes PR35272.

Added:
    llvm/trunk/test/CodeGen/X86/pr35272.ll
Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp?rev=318706&r1=318705&r2=318706&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp Mon Nov 20 15:08:50 2017
@@ -570,12 +570,11 @@ SDValue DAGTypeLegalizer::PromoteIntRes_
 
 SDValue DAGTypeLegalizer::PromoteIntRes_VSELECT(SDNode *N) {
   SDValue Mask = N->getOperand(0);
-  EVT OpTy = N->getOperand(1).getValueType();
 
-  // Promote all the way up to the canonical SetCC type.
-  Mask = PromoteTargetBoolean(Mask, OpTy);
   SDValue LHS = GetPromotedInteger(N->getOperand(1));
   SDValue RHS = GetPromotedInteger(N->getOperand(2));
+  // Promote all the way up to the canonical SetCC type.
+  Mask = PromoteTargetBoolean(Mask, LHS.getValueType());
   return DAG.getNode(ISD::VSELECT, SDLoc(N),
                      LHS.getValueType(), Mask, LHS, RHS);
 }

Added: llvm/trunk/test/CodeGen/X86/pr35272.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr35272.ll?rev=318706&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pr35272.ll (added)
+++ llvm/trunk/test/CodeGen/X86/pr35272.ll Mon Nov 20 15:08:50 2017
@@ -0,0 +1,14 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=skx | FileCheck %s
+
+define <2 x i48> @PR35272(<2 x i64> %a0, <2 x i48> %a1, <2 x i48> %a2) {
+; CHECK-LABEL: PR35272:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; CHECK-NEXT:    vpcmpeqq %xmm3, %xmm0, %k1
+; CHECK-NEXT:    vpblendmq %xmm1, %xmm2, %xmm0 {%k1}
+; CHECK-NEXT:    retq
+  %1 = icmp eq <2 x i64> %a0, zeroinitializer
+  %2 = select <2 x i1> %1, <2 x i48> %a1, <2 x i48> %a2
+  ret <2 x i48> %2
+}




More information about the llvm-commits mailing list