Skip to content

Commit

Permalink
[DAGCombiner] Use the result value type in visitCONCAT_VECTORS
Browse files Browse the repository at this point in the history
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
  • Loading branch information
francisvm committed Dec 10, 2018
1 parent cc6cf64 commit 753efe3
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 1 deletion.
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Expand Up @@ -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();
Expand Down
41 changes: 41 additions & 0 deletions llvm/test/CodeGen/X86/combine-concatvectors.ll
Expand Up @@ -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
}

0 comments on commit 753efe3

Please sign in to comment.