diff options
author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2018-12-10 14:31:34 +0000 |
---|---|---|
committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2018-12-10 14:31:34 +0000 |
commit | 753efe3584b777ce3c0e9a35579eaa3e02609bac (patch) | |
tree | 26d576eb58c4ed3d222f0f56b2d960b74e262f44 | |
parent | cc6cf64c38f49ad203aa2252c4209e21103f06f6 (diff) | |
download | bcm5719-llvm-753efe3584b777ce3c0e9a35579eaa3e02609bac.tar.gz bcm5719-llvm-753efe3584b777ce3c0e9a35579eaa3e02609bac.zip |
[DAGCombiner] Use the result value type in visitCONCAT_VECTORS
This triggers an assert when combining concat_vectors of a bitcast of
merge_values.
With asserts disabled, it fails to select:
fatal error: error in backend: Cannot select: 0x7ff19d000e90: i32 = any_extend 0x7ff19d000ae8
0x7ff19d000ae8: f64,ch = CopyFromReg 0x7ff19d000c20:1, Register:f64 %1
0x7ff19d000b50: f64 = Register %1
In function: d
Differential Revision: https://reviews.llvm.org/D55507
llvm-svn: 348759
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/combine-concatvectors.ll | 41 |
2 files changed, 42 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 24531c3cc85..7a2eb7646ec 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -16544,7 +16544,7 @@ SDValue DAGCombiner::visitCONCAT_VECTORS(SDNode *N) { TLI.isTypeLegal(Scalar->getOperand(0).getValueType())) Scalar = Scalar->getOperand(0); - EVT SclTy = Scalar->getValueType(0); + EVT SclTy = Scalar.getValueType(); if (!SclTy.isFloatingPoint() && !SclTy.isInteger()) return SDValue(); diff --git a/llvm/test/CodeGen/X86/combine-concatvectors.ll b/llvm/test/CodeGen/X86/combine-concatvectors.ll index 29cf6148203..ce2ec1ab109 100644 --- a/llvm/test/CodeGen/X86/combine-concatvectors.ll +++ b/llvm/test/CodeGen/X86/combine-concatvectors.ll @@ -16,3 +16,44 @@ define void @PR32957(<2 x float>* %in, <8 x float>* %out) { store <8 x float> %ins2, <8 x float>* %out, align 32 ret void } + +; Check that this does not fail to combine concat_vectors of a value from +; merge_values through a bitcast. +define void @d() personality i8* undef { +; CHECK-LABEL: d: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: pushq %rax +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: .Ltmp0: +; CHECK-NEXT: callq *%rax +; CHECK-NEXT: .Ltmp1: +; CHECK-NEXT: # %bb.1: # %bar +; CHECK-NEXT: .Ltmp2: +; CHECK-NEXT: callq *%rax +; CHECK-NEXT: .Ltmp3: +; CHECK-NEXT: # %bb.2: # %baz +; CHECK-NEXT: .LBB1_3: # %foo +; CHECK-NEXT: .Ltmp4: +entry: + %call16 = invoke { i8, double } undef() + to label %bar unwind label %foo + +foo: ; preds = %bar, %entry + %0 = landingpad { i8*, i32 } + cleanup + br label %bazr + +bar: ; preds = %entry + %1 = extractvalue { i8, double } %call16, 1 + %2 = bitcast double %1 to <2 x float> + invoke void undef() + to label %baz unwind label %foo + +baz: ; preds = %bar + %3 = extractelement <2 x float> %2, i64 0 + br label %bazr + +bazr: ; preds = %baz, %foo + %exn.obj = extractvalue { i8*, i32 } undef, 0 + unreachable +} |