Initial support for SLP tree throttling. Trims non-profitable subtrees, trying to maximize perf gains. Does not support trees with gathered loads yet, since they are not quite trees, but graphs. Analysis should be added later. Reviewers: RKSimon Pull Request: https://github.com/llvm/llvm-project/pull/162018 Recommit after revert in 6ec2ec4826b51d7d809fe08b36883a78d7dc0b98 with a fix
49 lines
2.7 KiB
LLVM
49 lines
2.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: opt --passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
define i1 @test(double %circ_radius, ptr %x) {
|
|
; CHECK-LABEL: define i1 @test(
|
|
; CHECK-SAME: double [[CIRC_RADIUS:%.*]], ptr [[X:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[X]], align 8
|
|
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x double> poison, double [[CIRC_RADIUS]], i32 1
|
|
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x double> [[TMP1]], double [[TMP0]], i32 0
|
|
; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[TMP2]], <4 x double> poison, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
|
|
; CHECK-NEXT: [[TMP4:%.*]] = fadd <4 x double> [[TMP3]], <double -0.000000e+00, double -0.000000e+00, double 0.000000e+00, double -0.000000e+00>
|
|
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <4 x double> [[TMP2]], <4 x double> <double 0.000000e+00, double poison, double 0.000000e+00, double 0.000000e+00>, <4 x i32> <i32 4, i32 0, i32 6, i32 7>
|
|
; CHECK-NEXT: [[TMP6:%.*]] = fmul <4 x double> [[TMP4]], [[TMP5]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x double> [[TMP6]], <4 x double> <double poison, double poison, double 0.000000e+00, double poison>, <4 x i32> <i32 1, i32 2, i32 6, i32 0>
|
|
; CHECK-NEXT: [[TMP8:%.*]] = fadd <4 x double> [[TMP6]], [[TMP7]]
|
|
; CHECK-NEXT: [[TMP9:%.*]] = call <4 x double> @llvm.sqrt.v4f64(<4 x double> [[TMP8]])
|
|
; CHECK-NEXT: [[TMP10:%.*]] = fcmp olt <4 x double> [[TMP9]], splat (double 1.000000e+00)
|
|
; CHECK-NEXT: [[TMP11:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP10]])
|
|
; CHECK-NEXT: ret i1 [[TMP11]]
|
|
;
|
|
entry:
|
|
%0 = load double, ptr %x, align 8
|
|
%square = fmul double %0, 0.000000e+00
|
|
%square105 = fmul double %0, %0
|
|
%add = fadd double %square, %square105
|
|
%sqrt116 = call double @llvm.sqrt.f64(double %add)
|
|
%add20 = fadd double %0, 0.000000e+00
|
|
%square106 = fmul double %add20, 0.000000e+00
|
|
%add25 = fadd double %square105, %square106
|
|
%sqrt115 = call double @llvm.sqrt.f64(double %add25)
|
|
%square109 = fmul double %circ_radius, 0.000000e+00
|
|
%add39 = fadd double %square106, 0.000000e+00
|
|
%sqrt114 = call double @llvm.sqrt.f64(double %add39)
|
|
%add50 = fadd double %square, %square109
|
|
%sqrt = call double @llvm.sqrt.f64(double %add50)
|
|
%cmp52 = fcmp olt double %sqrt116, 1.000000e+00
|
|
%cmp54 = fcmp olt double %sqrt115, 1.000000e+00
|
|
%or.cond = or i1 %cmp52, %cmp54
|
|
%cmp57 = fcmp olt double %sqrt114, 1.000000e+00
|
|
%or.cond112 = or i1 %or.cond, %cmp57
|
|
%cmp60 = fcmp olt double %sqrt, 1.000000e+00
|
|
%or.cond113 = or i1 %or.cond112, %cmp60
|
|
ret i1 %or.cond113
|
|
}
|
|
|
|
declare double @llvm.sqrt.f64(double)
|
|
|