mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
aeb0ec68a8
model the dense vector instruction bonuses. Previously, this code really didn't effectively compute the density of inlined vector instructions and apply the intended inliner bonus. It would try to compute it repeatedly while analyzing the function and didn't handle the case where future vector instructions would tip the scales back towards the bonus. Instead, speculatively apply all possible bonuses to the threshold initially. Once we *know* that a certain bonus can not be applied, subtract it. This should delay early bailout enough to get much more consistent results without actually causing us to analyze huge swaths of code. I expect some (hopefully mild) compile time hit here, and some swings in performance, but this was definitely the intended behavior of these bonuses. This also dramatically simplifies the computation of the bonuses to not interact with each other in confusing ways. The previous code didn't do a good job of this and the values for bonuses may be surprising but are at least now clearly written in the code. Finally, fix code to be in line with comments and use zero as the bailout condition. Patch by Easwaran Raman, with some comment tweaks by me to try and further clarify what is going on with this code. http://reviews.llvm.org/D8267 llvm-svn: 238276
38 lines
1.0 KiB
LLVM
38 lines
1.0 KiB
LLVM
; RUN: opt < %s -inline -inline-threshold=35 -S | FileCheck %s
|
|
|
|
define i32 @bar(<4 x i32> %v, i32 %i) #0 {
|
|
entry:
|
|
%cmp = icmp sgt i32 %i, 4
|
|
br i1 %cmp, label %if.then, label %if.else
|
|
|
|
if.then: ; preds = %entry
|
|
%mul1 = mul nsw i32 %i, %i
|
|
br label %return
|
|
|
|
if.else: ; preds = %entry
|
|
%add1 = add nsw i32 %i, %i
|
|
%add2 = add nsw i32 %i, %i
|
|
%add3 = add nsw i32 %i, %i
|
|
%add4 = add nsw i32 %i, %i
|
|
%add5 = add nsw i32 %i, %i
|
|
%add6 = add nsw i32 %i, %i
|
|
%vecext = extractelement <4 x i32> %v, i32 0
|
|
%vecext7 = extractelement <4 x i32> %v, i32 1
|
|
%add7 = add nsw i32 %vecext, %vecext7
|
|
br label %return
|
|
|
|
return: ; preds = %if.else, %if.then
|
|
%retval.0 = phi i32 [ %mul1, %if.then ], [ %add7, %if.else ]
|
|
ret i32 %retval.0
|
|
}
|
|
|
|
define i32 @foo(<4 x i32> %v, i32 %a) #1 {
|
|
; CHECK-LABEL: @foo(
|
|
; CHECK-NOT: call i32 @bar
|
|
; CHECK: ret
|
|
entry:
|
|
%call = call i32 @bar(<4 x i32> %v, i32 %a)
|
|
ret i32 %call
|
|
}
|
|
|