forked from OSchip/llvm-project
Don't use special heuristics for nodes with no data predecessors
unless they actually have data successors, and likewise for nodes with no data successors unless they actually have data precessors. llvm-svn: 64327
This commit is contained in:
parent
e5554deb45
commit
6571ef3577
|
@ -989,15 +989,16 @@ namespace {
|
|||
// EXTRACT_SUBREG / INSERT_SUBREG should be close to its use to
|
||||
// facilitate coalescing.
|
||||
return 0;
|
||||
if (SU->NumSuccs == 0)
|
||||
// If SU does not have a use, i.e. it doesn't produce a value that would
|
||||
// be consumed (e.g. store), then it terminates a chain of computation.
|
||||
// Give it a large SethiUllman number so it will be scheduled right
|
||||
// before its predecessors that it doesn't lengthen their live ranges.
|
||||
if (SU->NumSuccs == 0 && SU->NumPreds != 0)
|
||||
// If SU does not have a register use, i.e. it doesn't produce a value
|
||||
// that would be consumed (e.g. store), then it terminates a chain of
|
||||
// computation. Give it a large SethiUllman number so it will be
|
||||
// scheduled right before its predecessors that it doesn't lengthen
|
||||
// their live ranges.
|
||||
return 0xffff;
|
||||
if (SU->NumPreds == 0)
|
||||
// If SU does not have a def, schedule it close to its uses because it
|
||||
// does not lengthen any live ranges.
|
||||
if (SU->NumPreds == 0 && SU->NumSuccs != 0)
|
||||
// If SU does not have a register def, schedule it close to its uses
|
||||
// because it does not lengthen any live ranges.
|
||||
return 0;
|
||||
return SethiUllmanNumbers[SU->NodeNum];
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llvm-as < %s | llc -march=x86 -stats |& grep {Number of re-materialization} | grep 4
|
||||
; RUN: llvm-as < %s | llc -march=x86 -stats |& grep {Number of re-materialization} | grep 3
|
||||
; RUN: llvm-as < %s | llc -march=x86 -stats |& grep {Number of dead spill slots removed}
|
||||
; rdar://5761454
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llvm-as < %s | llc -mtriple=i386-apple-darwin -disable-fp-elim -stats -info-output-file - | not grep {Number of dead stores elided}
|
||||
; RUN: llvm-as < %s | llc -mtriple=i386-apple-darwin -disable-fp-elim -stats -info-output-file - | grep {Number of dead stores elided} | count 1
|
||||
; PR2568
|
||||
|
||||
@g_3 = external global i16 ; <i16*> [#uses=1]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llvm-as < %s | llc -march=x86 -mattr=sse41 -stack-alignment=16 > %t
|
||||
; RUN: grep pmul %t | count 12
|
||||
; RUN: grep mov %t | count 15
|
||||
; RUN: grep mov %t | count 12
|
||||
|
||||
define <4 x i32> @a(<4 x i32> %i) nounwind {
|
||||
%A = mul <4 x i32> %i, < i32 117, i32 117, i32 117, i32 117 >
|
||||
|
|
|
@ -2,9 +2,10 @@
|
|||
; RUN: llc -march=x86-64 -mattr=+64bit,+sse3 -print-failed-fuse-candidates |& \
|
||||
; RUN: grep fail | count 1
|
||||
|
||||
declare void @bar()
|
||||
declare <4 x float> @qux()
|
||||
declare <2 x double> @pin()
|
||||
declare float @test_f(float %f)
|
||||
declare double @test_d(double %f)
|
||||
declare <4 x float> @test_vf(<4 x float> %f)
|
||||
declare <2 x double> @test_vd(<2 x double> %f)
|
||||
declare float @llvm.sqrt.f32(float)
|
||||
declare double @llvm.sqrt.f64(double)
|
||||
|
||||
|
@ -26,99 +27,99 @@ declare <2 x double> @llvm.x86.sse3.hadd.pd(<2 x double>, <2 x double>)
|
|||
declare <2 x double> @llvm.x86.sse3.hsub.pd(<2 x double>, <2 x double>)
|
||||
|
||||
define float @foo(float %f) {
|
||||
call void @bar()
|
||||
%a = call float @test_f(float %f)
|
||||
%t = call float @llvm.sqrt.f32(float %f)
|
||||
ret float %t
|
||||
}
|
||||
define double @doo(double %f) {
|
||||
call void @bar()
|
||||
%a = call double @test_d(double %f)
|
||||
%t = call double @llvm.sqrt.f64(double %f)
|
||||
ret double %t
|
||||
}
|
||||
define <4 x float> @a0(<4 x float> %f) {
|
||||
call void @bar()
|
||||
%a = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float> %f)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <4 x float> @a1(<4 x float> %f) {
|
||||
call void @bar()
|
||||
%a = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float> %f)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <4 x float> @a2(<4 x float> %f) {
|
||||
call void @bar()
|
||||
%a = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse.rcp.ps(<4 x float> %f)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <4 x float> @b3(<4 x float> %f) {
|
||||
%y = call <4 x float> @qux()
|
||||
%y = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse.min.ps(<4 x float> %y, <4 x float> %f)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <4 x float> @b4(<4 x float> %f) {
|
||||
%y = call <4 x float> @qux()
|
||||
%y = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse.max.ps(<4 x float> %y, <4 x float> %f)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <4 x float> @b5(<4 x float> %f) {
|
||||
%y = call <4 x float> @qux()
|
||||
%y = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse.cmp.ps(<4 x float> %y, <4 x float> %f, i8 7)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <4 x float> @b6(<4 x float> %f) {
|
||||
%y = call <4 x float> @qux()
|
||||
%y = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse3.addsub.ps(<4 x float> %y, <4 x float> %f)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <4 x float> @b7(<4 x float> %f) {
|
||||
%y = call <4 x float> @qux()
|
||||
%y = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse3.hadd.ps(<4 x float> %y, <4 x float> %f)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <4 x float> @b8(<4 x float> %f) {
|
||||
%y = call <4 x float> @qux()
|
||||
%y = call <4 x float> @test_vf(<4 x float> %f)
|
||||
%t = call <4 x float> @llvm.x86.sse3.hsub.ps(<4 x float> %y, <4 x float> %f)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
define <2 x double> @c1(<2 x double> %f) {
|
||||
call void @bar()
|
||||
%a = call <2 x double> @test_vd(<2 x double> %f)
|
||||
%t = call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %f)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
define <2 x double> @d3(<2 x double> %f) {
|
||||
%y = call <2 x double> @pin()
|
||||
%y = call <2 x double> @test_vd(<2 x double> %f)
|
||||
%t = call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %y, <2 x double> %f)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
define <2 x double> @d4(<2 x double> %f) {
|
||||
%y = call <2 x double> @pin()
|
||||
%y = call <2 x double> @test_vd(<2 x double> %f)
|
||||
%t = call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %y, <2 x double> %f)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
define <2 x double> @d5(<2 x double> %f) {
|
||||
%y = call <2 x double> @pin()
|
||||
%y = call <2 x double> @test_vd(<2 x double> %f)
|
||||
%t = call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %y, <2 x double> %f, i8 7)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
define <2 x double> @d6(<2 x double> %f) {
|
||||
%y = call <2 x double> @pin()
|
||||
%y = call <2 x double> @test_vd(<2 x double> %f)
|
||||
%t = call <2 x double> @llvm.x86.sse3.addsub.pd(<2 x double> %y, <2 x double> %f)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
define <2 x double> @d7(<2 x double> %f) {
|
||||
%y = call <2 x double> @pin()
|
||||
%y = call <2 x double> @test_vd(<2 x double> %f)
|
||||
%t = call <2 x double> @llvm.x86.sse3.hadd.pd(<2 x double> %y, <2 x double> %f)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
define <2 x double> @d8(<2 x double> %f) {
|
||||
%y = call <2 x double> @pin()
|
||||
%y = call <2 x double> @test_vd(<2 x double> %f)
|
||||
%t = call <2 x double> @llvm.x86.sse3.hsub.pd(<2 x double> %y, <2 x double> %f)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
|
||||
; This one should fail to fuse.
|
||||
define <2 x double> @z0(<2 x double> %f) {
|
||||
%y = call <2 x double> @pin()
|
||||
%y = call <2 x double> @test_vd(<2 x double> %f)
|
||||
%t = call <2 x double> @llvm.x86.sse3.hsub.pd(<2 x double> %f, <2 x double> %y)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue