Files
clang-p2996/llvm/test/Transforms/SLPVectorizer/X86/extracts-with-undefs.ll
Alexey Bataev e5b191a433 [SLP]Improve/fix reodering for gather nodes with extractelements/undefs.
If the gather node is a mix of undefvalues and exractelement
instructions, need to take the ordering for such nodes into account too.
It allows to reorder some (sub)trees and remove some extra shuffles,
improving overall vectorization.
Also, outlined common functionality into a separate function.

Differential Revision: https://reviews.llvm.org/D115358
2021-12-13 10:59:38 -08:00

66 lines
3.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
define void @test() {
; CHECK-LABEL: @test(
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[BODY:%.*]]
; CHECK: body:
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x double> [ zeroinitializer, [[ENTRY:%.*]] ], [ zeroinitializer, [[BODY]] ]
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x double> [[TMP0]], i32 1
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> <double undef, double poison>, double [[TMP1]], i32 1
; CHECK-NEXT: [[TMP3:%.*]] = fmul fast <2 x double> [[TMP2]], zeroinitializer
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x double> [[TMP3]], i32 0
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x double> [[TMP3]], i32 1
; CHECK-NEXT: [[ADD8_I_I:%.*]] = fadd fast double [[TMP5]], [[TMP4]]
; CHECK-NEXT: [[CMP42_I:%.*]] = fcmp fast ole double [[ADD8_I_I]], 0.000000e+00
; CHECK-NEXT: br i1 false, label [[BODY]], label [[EXIT:%.*]]
; CHECK: exit:
; CHECK-NEXT: br i1 false, label [[IF_THEN135_I:%.*]], label [[IF_END209_I:%.*]]
; CHECK: if.then135.i:
; CHECK-NEXT: [[TMP6:%.*]] = fcmp fast olt <2 x double> [[TMP0]], zeroinitializer
; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i1> [[TMP6]], i32 0
; CHECK-NEXT: [[TMP8:%.*]] = insertelement <2 x i1> <i1 poison, i1 false>, i1 [[TMP7]], i32 0
; CHECK-NEXT: [[TMP9:%.*]] = select <2 x i1> [[TMP8]], <2 x double> zeroinitializer, <2 x double> zeroinitializer
; CHECK-NEXT: [[TMP10:%.*]] = fmul fast <2 x double> zeroinitializer, [[TMP9]]
; CHECK-NEXT: [[TMP11:%.*]] = fmul fast <2 x double> [[TMP10]], zeroinitializer
; CHECK-NEXT: [[TMP12:%.*]] = fadd fast <2 x double> [[TMP11]], zeroinitializer
; CHECK-NEXT: br label [[IF_END209_I]]
; CHECK: if.end209.i:
; CHECK-NEXT: [[TMP13:%.*]] = phi <2 x double> [ [[TMP12]], [[IF_THEN135_I]] ], [ zeroinitializer, [[EXIT]] ]
; CHECK-NEXT: ret void
;
entry:
br label %body
body:
%phi1 = phi double [ 0.000000e+00, %entry ], [ 0.000000e+00, %body ]
%phi2 = phi double [ 0.000000e+00, %entry ], [ 0.000000e+00, %body ]
%mul.i478.i = fmul fast double %phi1, 0.000000e+00
%mul7.i485.i = fmul fast double undef, 0.000000e+00
%add8.i.i = fadd fast double %mul.i478.i, %mul7.i485.i
%cmp42.i = fcmp fast ole double %add8.i.i, 0.000000e+00
br i1 false, label %body, label %exit
exit:
br i1 false, label %if.then135.i, label %if.end209.i
if.then135.i:
%cmp145.i = fcmp fast olt double %phi1, 0.000000e+00
%0 = select i1 false, double 0.000000e+00, double 0.000000e+00
%cmp152.i = fcmp fast olt double %phi2, 0.000000e+00
%1 = select i1 %cmp152.i, double 0.000000e+00, double 0.000000e+00
%mul166.i = fmul fast double 0.000000e+00, %0
%mul177.i = fmul fast double %mul166.i, 0.000000e+00
%add178.i = fadd fast double %mul177.i, 0.000000e+00
%mul181.i = fmul fast double 0.000000e+00, %1
%mul182.i = fmul fast double %mul181.i, 0.000000e+00
%add183.i = fadd fast double %mul182.i, 0.000000e+00
br label %if.end209.i
if.end209.i:
%drdys.1.i = phi double [ %add183.i, %if.then135.i ], [ 0.000000e+00, %exit ]
%dbdxs.1.i = phi double [ %add178.i, %if.then135.i ], [ 0.000000e+00, %exit ]
ret void
}