Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit e7b6244

Browse files
committed
[X86] Relax an assertion when legalizing vector types.
WidenVSELECTAndMask can fold (and it folds in this case) so we get a BUILD_VECTOR of constants as mask. convertMask() seems to work fine when the input is a vector of constants, and we still need to call it to extend/add elements at the end. but the current code just asserts on anything but a SETCC or AND/OR/XOR of 2xSETCC. This change was discussed briefly with Simon Pilgrim, who also suggests we might consider dropping this assertion in the future. Fixes PR33715. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307508 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 6c560b5 commit e7b6244

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2977,7 +2977,11 @@ SDValue DAGTypeLegalizer::convertMask(SDValue InMask, EVT MaskVT,
29772977

29782978
// Currently a SETCC or a AND/OR/XOR with two SETCCs are handled.
29792979
unsigned InMaskOpc = InMask->getOpcode();
2980+
2981+
// FIXME: This code seems to be too restrictive, we might consider
2982+
// generalizing it or dropping it.
29802983
assert((InMaskOpc == ISD::SETCC ||
2984+
ISD::isBuildVectorOfConstantSDNodes(InMask.getNode()) ||
29812985
(isLogicalMaskOp(InMaskOpc) &&
29822986
isSETCCorConvertedSETCC(InMask->getOperand(0)) &&
29832987
isSETCCorConvertedSETCC(InMask->getOperand(1)))) &&

test/CodeGen/X86/pr33715.ll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
; Make sure we don't crash with a build vector of integer constants.
2+
; RUN: llc %s -o /dev/null
3+
4+
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5+
target triple = "x86_64-unknown-linux-gnu"
6+
7+
define i32 @patatino() {
8+
%tmp = insertelement <4 x i32> <i32 1, i32 1, i32 undef, i32 undef>, i32 1, i32 2
9+
%tmp1 = insertelement <4 x i32> %tmp, i32 1, i32 3
10+
%tmp2 = icmp ne <4 x i32> %tmp1, zeroinitializer
11+
%tmp3 = icmp slt <4 x i32> %tmp1, <i32 4, i32 4, i32 4, i32 4>
12+
%tmp4 = or <4 x i1> %tmp2, %tmp3
13+
%tmp5 = select <4 x i1> %tmp4, <4 x i32> zeroinitializer, <4 x i32> <i32 4, i32 4, i32 4, i32 4>
14+
%tmp6 = extractelement <4 x i32> %tmp5, i32 0
15+
ret i32 %tmp6
16+
}

0 commit comments

Comments
 (0)