Author: hans
Date: Thu Jan 18 03:16:33 2018
New Revision: 322835

URL: http://llvm.org/viewvc/llvm-project?rev=322835&view=rev
Log:
Merging r322724:
------------------------------------------------------------------------
r322724 | ctopper | 2018-01-17 10:46:01 -0800 (Wed, 17 Jan 2018) | 7 lines

[X86] When legalizing (v64i1 select i8, v64i1, v64i1) make sure not to 
introduce bitcasts to i64 in 32-bit mode

We legalize selects of masks with scalar conditions using a bitcast to an 
integer type. But if we are in 32-bit mode we can't convert v64i1 to i64. So 
instead split the v64i1 to v32i1 and concat it back together. Each half will 
then be legalized by bitcasting to i32 which is fine.

The test case is a little indirect. If we have the v64i1 select in IR it will 
get legalized by legalize vector ops which has a run of type legalization after 
it. That type legalization run is able to fix this i64 bitcast. So in order to 
avoid that we need a build_vector of a splat which legalize vector ops will 
ignore. Legalize DAG will then turn that into a select via 
LowerBUILD_VECTORvXi1. And the select will get legalized. In this case there is 
no type legalizer run to cleanup the bitcast.

This fixes pr35972.
------------------------------------------------------------------------

Added:
    llvm/branches/release_60/test/CodeGen/X86/pr35972.ll
      - copied unchanged from r322724, llvm/trunk/test/CodeGen/X86/pr35972.ll
Modified:
    llvm/branches/release_60/   (props changed)
    llvm/branches/release_60/lib/Target/X86/X86ISelLowering.cpp

Propchange: llvm/branches/release_60/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jan 18 03:16:33 2018
@@ -1,3 +1,3 @@
 /llvm/branches/Apple/Pertwee:110850,110961
 /llvm/branches/type-system-rewrite:133420-134817
-/llvm/trunk:155241,321751,321789,321791,321806,321862,321870,321872,321878,321980,321991,321993-321994,322003,322056,322103,322106,322223,322272,322313,322473,322623
+/llvm/trunk:155241,321751,321789,321791,321806,321862,321870,321872,321878,321980,321991,321993-321994,322003,322056,322103,322106,322223,322272,322313,322473,322623,322724

Modified: llvm/branches/release_60/lib/Target/X86/X86ISelLowering.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/branches/release_60/lib/Target/X86/X86ISelLowering.cpp?rev=322835&r1=322834&r2=322835&view=diff
==============================================================================
--- llvm/branches/release_60/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/branches/release_60/lib/Target/X86/X86ISelLowering.cpp Thu Jan 18 
03:16:33 2018
@@ -18267,6 +18267,18 @@ SDValue X86TargetLowering::LowerSELECT(S
     return DAG.getNode(X86ISD::SELECTS, DL, VT, Cmp, Op1, Op2);
   }
 
+  // For v64i1 without 64-bit support we need to split and rejoin.
+  if (VT == MVT::v64i1 && !Subtarget.is64Bit()) {
+    assert(Subtarget.hasBWI() && "Expected BWI to be legal");
+    SDValue Op1Lo = extractSubVector(Op1, 0, DAG, DL, 32);
+    SDValue Op2Lo = extractSubVector(Op2, 0, DAG, DL, 32);
+    SDValue Op1Hi = extractSubVector(Op1, 32, DAG, DL, 32);
+    SDValue Op2Hi = extractSubVector(Op2, 32, DAG, DL, 32);
+    SDValue Lo = DAG.getSelect(DL, MVT::v32i1, Cond, Op1Lo, Op2Lo);
+    SDValue Hi = DAG.getSelect(DL, MVT::v32i1, Cond, Op1Hi, Op2Hi);
+    return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, Lo, Hi);
+  }
+
   if (VT.isVector() && VT.getVectorElementType() == MVT::i1) {
     SDValue Op1Scalar;
     if (ISD::isBuildVectorOfConstantSDNodes(Op1.getNode()))


_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to