The compiler should not ignore UndefValue when gathering the scalars, otherwise the resulting code may be less defined than the original one. Also, grouped scalars to insert them at first to reduce the analysis in further passes. Differential Revision: https://reviews.llvm.org/D105275
49 lines
1.5 KiB
LLVM
49 lines
1.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -slp-vectorizer -mtriple=x86_64-apple-macosx10.9.0 -S -o - | FileCheck %s
|
|
|
|
target datalayout = "f64:64:64-v64:64:64"
|
|
|
|
define void @test_phi_in_landingpad() personality i8*
|
|
; CHECK-LABEL: @test_phi_in_landingpad(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: invoke void @foo()
|
|
; CHECK-NEXT: to label [[INNER:%.*]] unwind label [[LPAD:%.*]]
|
|
; CHECK: inner:
|
|
; CHECK-NEXT: invoke void @foo()
|
|
; CHECK-NEXT: to label [[DONE:%.*]] unwind label [[LPAD]]
|
|
; CHECK: lpad:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x double> [ undef, [[ENTRY:%.*]] ], [ undef, [[INNER]] ]
|
|
; CHECK-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
|
|
; CHECK-NEXT: catch i8* null
|
|
; CHECK-NEXT: br label [[DONE]]
|
|
; CHECK: done:
|
|
; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x double> [ undef, [[INNER]] ], [ [[TMP0]], [[LPAD]] ]
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
|
entry:
|
|
invoke void @foo()
|
|
to label %inner unwind label %lpad
|
|
|
|
inner:
|
|
%x0 = fsub double undef, undef
|
|
%y0 = fsub double undef, undef
|
|
invoke void @foo()
|
|
to label %done unwind label %lpad
|
|
|
|
lpad:
|
|
%x1 = phi double [ undef, %entry ], [ undef, %inner ]
|
|
%y1 = phi double [ undef, %entry ], [ undef, %inner ]
|
|
landingpad { i8*, i32 } catch i8* null
|
|
br label %done
|
|
|
|
done:
|
|
phi double [ %x0, %inner ], [ %x1, %lpad ]
|
|
phi double [ %y0, %inner ], [ %y1, %lpad ]
|
|
ret void
|
|
}
|
|
|
|
declare void @foo()
|
|
|
|
declare i32 @__gxx_personality_v0(...)
|