llvm-project/llvm/test/Transforms/SLPVectorizer/X86/vectorize-widest-phis.ll
Alexey Bataev d65cc85977 [SLP]Do not schedule instructions with constants/argument/phi operands and external users.
No need to schedule entry nodes where all instructions are not memory
read/write instructions and their operands are either constants, or
arguments, or phis, or instructions from others blocks, or their users
are phis or from the other blocks.
The resulting vector instructions can be placed at
the beginning of the basic block without scheduling (if operands does
not need to be scheduled) or at the end of the block (if users are
outside of the block).
It may save some compile time and scheduling resources.

Differential Revision: https://reviews.llvm.org/D121121
2022-03-17 11:03:45 -07:00

84 lines
3.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -slp-vectorizer -S -mcpu=cascadelake -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
define void @foo() {
; CHECK-LABEL: @foo(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CONV:%.*]] = uitofp i16 undef to float
; CHECK-NEXT: [[SUB:%.*]] = fsub float 6.553500e+04, undef
; CHECK-NEXT: br label [[BB1:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x float> poison, float [[SUB]], i32 0
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> [[TMP0]], float [[CONV]], i32 1
; CHECK-NEXT: br label [[BB2:%.*]]
; CHECK: bb2:
; CHECK-NEXT: [[TMP2:%.*]] = phi <4 x float> [ [[TMP1]], [[BB1]] ], [ [[TMP18:%.*]], [[BB3:%.*]] ]
; CHECK-NEXT: [[TMP3:%.*]] = load double, double* undef, align 8
; CHECK-NEXT: br i1 undef, label [[BB3]], label [[BB4:%.*]]
; CHECK: bb4:
; CHECK-NEXT: [[TMP4:%.*]] = fpext <4 x float> [[TMP2]] to <4 x double>
; CHECK-NEXT: [[CONV2:%.*]] = uitofp i16 undef to double
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x double> <double undef, double poison>, double [[TMP3]], i32 1
; CHECK-NEXT: [[TMP6:%.*]] = insertelement <2 x double> <double undef, double poison>, double [[CONV2]], i32 1
; CHECK-NEXT: [[TMP7:%.*]] = fsub <2 x double> [[TMP5]], [[TMP6]]
; CHECK-NEXT: [[TMP8:%.*]] = fadd <2 x double> [[TMP5]], [[TMP6]]
; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <2 x double> [[TMP7]], <2 x double> [[TMP8]], <2 x i32> <i32 0, i32 3>
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x double> [[TMP9]], i32 0
; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x double> poison, double [[TMP10]], i32 0
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x double> [[TMP9]], i32 1
; CHECK-NEXT: [[TMP13:%.*]] = insertelement <4 x double> [[TMP11]], double [[TMP12]], i32 1
; CHECK-NEXT: [[TMP14:%.*]] = fcmp ogt <4 x double> [[TMP13]], [[TMP4]]
; CHECK-NEXT: [[TMP15:%.*]] = shufflevector <2 x double> [[TMP9]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
; CHECK-NEXT: [[TMP16:%.*]] = fptrunc <4 x double> [[TMP15]] to <4 x float>
; CHECK-NEXT: [[TMP17:%.*]] = select <4 x i1> [[TMP14]], <4 x float> [[TMP2]], <4 x float> [[TMP16]]
; CHECK-NEXT: br label [[BB3]]
; CHECK: bb3:
; CHECK-NEXT: [[TMP18]] = phi <4 x float> [ [[TMP17]], [[BB4]] ], [ [[TMP2]], [[BB2]] ]
; CHECK-NEXT: br label [[BB2]]
;
entry:
%conv = uitofp i16 undef to float
%sub = fsub float 6.553500e+04, undef
br label %bb1
bb1:
br label %bb2
bb2:
%0 = phi float [ %sub, %bb1 ], [ %9, %bb3 ]
%1 = phi float [ %conv, %bb1 ], [ %10, %bb3 ]
%2 = phi float [ undef, %bb1 ], [ %11, %bb3 ]
%3 = phi float [ undef, %bb1 ], [ %12, %bb3 ]
%4 = load double, double* undef, align 8
br i1 undef, label %bb3, label %bb4
bb4:
%ext = fpext float %3 to double
%cmp1 = fcmp ogt double undef, %ext
%5 = fptrunc double undef to float
%sel1 = select i1 %cmp1, float %3, float %5
%ext2 = fpext float %2 to double
%cmp2 = fcmp ogt double undef, %ext2
%6 = fptrunc double undef to float
%sel2 = select i1 %cmp2, float %2, float %6
%ext3 = fpext float %1 to double
%conv2 = uitofp i16 undef to double
%add1 = fadd double %4, %conv2
%cmp3 = fcmp ogt double %add1, %ext3
%7 = fptrunc double %add1 to float
%sel3 = select i1 %cmp3, float %1, float %7
%ext4 = fpext float %0 to double
%sub1 = fsub double undef, undef
%cmp4 = fcmp ogt double %sub1, %ext4
%8 = fptrunc double %sub1 to float
%sel4 = select i1 %cmp4, float %0, float %8
br label %bb3
bb3:
%9 = phi float [ %sel4, %bb4 ], [ %0, %bb2 ]
%10 = phi float [ %sel3, %bb4 ], [ %1, %bb2 ]
%11 = phi float [ %sel2, %bb4 ], [ %2, %bb2 ]
%12 = phi float [ %sel1, %bb4 ], [ %3, %bb2 ]
br label %bb2
}