mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
1c46c7087d
It caused assertions to fire when building Chromium: lib/CodeGen/LiveDebugValues.cpp:331: bool {anonymous}::LiveDebugValues::OpenRangesSet::empty() const: Assertion `Vars.empty() == VarLocs.empty() && "open ranges are inconsistent"' failed. See https://crbug.com/992871#c3 for how to reproduce. > Patch https://reviews.llvm.org/D43256 introduced more aggressive loop layout optimization which depends on profile information. If profile information is not available, the statically estimated profile information(generated by BranchProbabilityInfo.cpp) is used. If user program doesn't behave as BranchProbabilityInfo.cpp expected, the layout may be worse. > > To be conservative this patch restores the original layout algorithm in plain mode. But user can still try the aggressive layout optimization with -force-precise-rotation-cost=true. > > Differential Revision: https://reviews.llvm.org/D65673 llvm-svn: 368579
123 lines
2.2 KiB
LLVM
123 lines
2.2 KiB
LLVM
; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux < %s | FileCheck %s
|
|
; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -precise-rotation-cost < %s | FileCheck %s -check-prefix=CHECK-PROFILE
|
|
|
|
define void @foo() {
|
|
; Test a nested loop case when profile data is not available.
|
|
;
|
|
; CHECK-LABEL: foo:
|
|
; CHECK: callq g
|
|
; CHECK: callq h
|
|
; CHECK: callq b
|
|
; CHECK: callq e
|
|
; CHECK: callq f
|
|
; CHECK: callq c
|
|
; CHECK: callq d
|
|
|
|
entry:
|
|
br label %header
|
|
|
|
header:
|
|
call void @b()
|
|
%call = call zeroext i1 @a()
|
|
br i1 %call, label %if.then, label %if.else, !prof !2
|
|
|
|
if.then:
|
|
br label %header2
|
|
|
|
header2:
|
|
call void @c()
|
|
%call1 = call zeroext i1 @a()
|
|
br i1 %call1, label %if.then2, label %if.else2, !prof !2
|
|
|
|
if.then2:
|
|
call void @d()
|
|
br label %if.end2
|
|
|
|
if.else2:
|
|
call void @e()
|
|
br label %if.end2
|
|
|
|
if.end2:
|
|
call void @f()
|
|
%call2 = call zeroext i1 @a()
|
|
br i1 %call2, label %header2, label %if.end
|
|
|
|
if.else:
|
|
call void @g()
|
|
br label %if.end
|
|
|
|
if.end:
|
|
call void @h()
|
|
%call3 = call zeroext i1 @a()
|
|
br i1 %call3, label %header, label %end
|
|
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
define void @bar() !prof !1 {
|
|
; Test a nested loop case when profile data is available.
|
|
;
|
|
; CHECK-PROFILE-LABEL: bar:
|
|
; CHECK-PROFILE: callq h
|
|
; CHECK-PROFILE: callq b
|
|
; CHECK-PROFILE: callq g
|
|
; CHECK-PROFILE: callq e
|
|
; CHECK-PROFILE: callq f
|
|
; CHECK-PROFILE: callq c
|
|
; CHECK-PROFILE: callq d
|
|
|
|
entry:
|
|
br label %header
|
|
|
|
header:
|
|
call void @b()
|
|
%call = call zeroext i1 @a()
|
|
br i1 %call, label %if.then, label %if.else, !prof !2
|
|
|
|
if.then:
|
|
br label %header2
|
|
|
|
header2:
|
|
call void @c()
|
|
%call1 = call zeroext i1 @a()
|
|
br i1 %call1, label %if.then2, label %if.else2, !prof !2
|
|
|
|
if.then2:
|
|
call void @d()
|
|
br label %if.end2
|
|
|
|
if.else2:
|
|
call void @e()
|
|
br label %if.end2
|
|
|
|
if.end2:
|
|
call void @f()
|
|
%call2 = call zeroext i1 @a()
|
|
br i1 %call2, label %header2, label %if.end
|
|
|
|
if.else:
|
|
call void @g()
|
|
br label %if.end
|
|
|
|
if.end:
|
|
call void @h()
|
|
%call3 = call zeroext i1 @a()
|
|
br i1 %call3, label %header, label %end
|
|
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
declare zeroext i1 @a()
|
|
declare void @b()
|
|
declare void @c()
|
|
declare void @d()
|
|
declare void @e()
|
|
declare void @f()
|
|
declare void @g()
|
|
declare void @h()
|
|
|
|
!1 = !{!"function_entry_count", i64 1}
|
|
!2 = !{!"branch_weights", i32 16, i32 16}
|