[llvm] r236308 - [SelectionDAG] Unary vector constant folding integer legality fixes
Simon Pilgrim
llvm-dev at redking.me.uk
Fri May 1 01:20:05 PDT 2015
Author: rksimon
Date: Fri May 1 03:20:04 2015
New Revision: 236308
URL: http://llvm.org/viewvc/llvm-project?rev=236308&view=rev
Log:
[SelectionDAG] Unary vector constant folding integer legality fixes
This patch fixes issues with vector constant folding not correctly handling scalar input operands if they require implicit truncation - this was tested with llvm-stress as recommended by Patrik H Hagglund.
The patch ensures that integer input scalars from a build vector are correctly truncated before folding, and that constant integer scalar results are promoted to a legal type before inclusion in the new folded build vector.
I have added another crash test case and also a test for UINT_TO_FP / SINT_TO_FP using an non-truncated scalar input, which was failing before this patch.
Differential Revision: http://reviews.llvm.org/D9282
Added:
llvm/trunk/test/CodeGen/X86/fold-vector-bv-crash.ll
llvm/trunk/test/CodeGen/X86/fold-vector-trunc-sitofp.ll
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=236308&r1=236307&r2=236308&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri May 1 03:20:04 2015
@@ -2858,23 +2858,43 @@ SDValue SelectionDAG::getNode(unsigned O
// FIXME: Entirely reasonable to perform folding of other unary
// operations here as the need arises.
break;
- case ISD::TRUNCATE:
- // Constant build vector truncation can be done with the original scalar
- // operands but with a new build vector with the truncated value type.
- return getNode(ISD::BUILD_VECTOR, DL, VT, BV->ops());
case ISD::FNEG:
case ISD::FABS:
case ISD::FCEIL:
case ISD::FTRUNC:
case ISD::FFLOOR:
case ISD::FP_EXTEND:
+ case ISD::TRUNCATE:
case ISD::UINT_TO_FP:
case ISD::SINT_TO_FP: {
+ EVT SVT = VT.getScalarType();
+ EVT InVT = BV->getValueType(0);
+ EVT InSVT = InVT.getScalarType();
+
+ // Find legal integer scalar type for constant promotion.
+ EVT LegalSVT = SVT;
+ if (SVT.isInteger()) {
+ LegalSVT = TLI->getTypeToTransformTo(*getContext(), SVT);
+ assert(LegalSVT.bitsGE(SVT) && "Unexpected legal scalar type size");
+ }
+
// Let the above scalar folding handle the folding of each element.
SmallVector<SDValue, 8> Ops;
for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
SDValue OpN = BV->getOperand(i);
- OpN = getNode(Opcode, DL, VT.getVectorElementType(), OpN);
+ EVT OpVT = OpN.getValueType();
+
+ // Build vector (integer) scalar operands may need implicit
+ // truncation - do this before constant folding.
+ if (OpVT.isInteger() && OpVT.bitsGT(InSVT))
+ OpN = getNode(ISD::TRUNCATE, DL, InSVT, OpN);
+
+ OpN = getNode(Opcode, DL, SVT, OpN);
+
+ // Legalize the (integer) scalar constant if necessary.
+ if (LegalSVT != SVT)
+ OpN = getNode(ISD::ANY_EXTEND, DL, LegalSVT, OpN);
+
if (OpN.getOpcode() != ISD::UNDEF &&
OpN.getOpcode() != ISD::Constant &&
OpN.getOpcode() != ISD::ConstantFP)
Added: llvm/trunk/test/CodeGen/X86/fold-vector-bv-crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fold-vector-bv-crash.ll?rev=236308&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/fold-vector-bv-crash.ll (added)
+++ llvm/trunk/test/CodeGen/X86/fold-vector-bv-crash.ll Fri May 1 03:20:04 2015
@@ -0,0 +1,17 @@
+; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx
+; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx
+
+;
+; llvm-stress generated crash case due to build_vector implicit
+; truncation bug from constant folding after legalization.
+;
+
+ at G = external global i32
+
+define void @bv_crash_test() {
+ %I = insertelement <4 x i64> zeroinitializer, i64 15910, i32 0
+ %Tr = trunc <4 x i64> %I to <4 x i8>
+ %Bc = bitcast <4 x i8> %Tr to i32
+ store volatile i32 %Bc, i32* @G
+ ret void
+}
Added: llvm/trunk/test/CodeGen/X86/fold-vector-trunc-sitofp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fold-vector-trunc-sitofp.ll?rev=236308&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/fold-vector-trunc-sitofp.ll (added)
+++ llvm/trunk/test/CodeGen/X86/fold-vector-trunc-sitofp.ll Fri May 1 03:20:04 2015
@@ -0,0 +1,13 @@
+; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s
+
+; Check that constant integers are correctly being truncated before float conversion
+
+define <4 x float> @test1() {
+; CHECK-LABEL: test1
+; CHECK: movaps {{.*#+}} xmm0 = [-1.000000e+00,0.000000e+00,-1.000000e+00,0.000000e+00]
+; CHECK-NEXT: ret
+ %1 = trunc <4 x i3> <i3 -1, i3 -22, i3 7, i3 8> to <4 x i1>
+ %2 = sitofp <4 x i1> %1 to <4 x float>
+ ret <4 x float> %2
+}
More information about the llvm-commits
mailing list