[llvm] r335323 - [X86] Changing the check for valid inputs in combineScalarToVector
Mikhail Dvoretckii via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 22 01:28:05 PDT 2018
Author: mike.dvoretsky
Date: Fri Jun 22 01:28:05 2018
New Revision: 335323
URL: http://llvm.org/viewvc/llvm-project?rev=335323&view=rev
Log:
[X86] Changing the check for valid inputs in combineScalarToVector
Changing the logic of scalar mask folding to check for valid input types rather
than against invalid ones, making it more robust and fixing PR37879.
Differential Revision: https://reviews.llvm.org/D48366
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
llvm/trunk/test/CodeGen/X86/pr37879.ll
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=335323&r1=335322&r2=335323&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Fri Jun 22 01:28:05 2018
@@ -39229,7 +39229,8 @@ static SDValue combineScalarToVector(SDN
if (C->getAPIntValue().isOneValue()) {
SDValue Mask = Src.getOperand(0);
if (Mask.getOpcode() == ISD::TRUNCATE &&
- Mask.getOperand(0).getValueType() != MVT::i16)
+ (Mask.getOperand(0).getValueType() == MVT::i8 ||
+ Mask.getOperand(0).getValueType() == MVT::i32))
Mask = Mask.getOperand(0);
return DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), MVT::v1i1, Mask);
}
@@ -39243,11 +39244,11 @@ static SDValue combineScalarToVector(SDN
if (C->getAPIntValue().isOneValue()) {
SDValue Mask = Src.getOperand(0).getOperand(0);
if (Mask.getOpcode() == ISD::TRUNCATE &&
- Mask.getOperand(0).getValueType() != MVT::i16)
+ (Mask.getOperand(0).getValueType() == MVT::i8 ||
+ Mask.getOperand(0).getValueType() == MVT::i32))
Mask = Mask.getOperand(0);
- // Check if the initial value is an i16. scalar_to_vector fails to
- // select for that type, so the combine should be aborted.
- if (Mask.getValueType() == MVT::i16)
+ // Check if the initial value is of a legal type for scalar_to_vector.
+ if (Mask.getValueType() != MVT::i8 && Mask.getValueType() != MVT::i32)
return SDValue();
return DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), MVT::v1i1, Mask);
}
Modified: llvm/trunk/test/CodeGen/X86/pr37879.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr37879.ll?rev=335323&r1=335322&r2=335323&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pr37879.ll (original)
+++ llvm/trunk/test/CodeGen/X86/pr37879.ll Fri Jun 22 01:28:05 2018
@@ -1,7 +1,15 @@
-; XFAIL: *
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -O3 < %s -mtriple=x86_64-apple-darwin -mattr=+avx512bw | FileCheck %s
define double @foo(i32** nocapture readonly) #0 {
+; CHECK-LABEL: foo:
+; CHECK: ## %bb.0:
+; CHECK-NEXT: movq (%rax), %rax
+; CHECK-NEXT: vcvtsi2sdq %rax, %xmm0, %xmm1
+; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
+; CHECK-NEXT: kmovd %eax, %k1
+; CHECK-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}
+; CHECK-NEXT: retq
%2 = load i64, i64* undef, align 8
%3 = and i64 %2, 1
%4 = icmp eq i64 %3, 0
More information about the llvm-commits
mailing list