When hoisting loop invariant instructions, we can preserve profile metadata because it depends solely on the condition (which is loop invariant) rather than where we are in the control flow graph.
40 lines
1.2 KiB
LLVM
40 lines
1.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: opt -passes="loop-simplify" -S %s | FileCheck %s
|
|
|
|
define void @test_drop(i8 %a) !prof !0 {
|
|
; CHECK-LABEL: define void @test_drop(
|
|
; CHECK-SAME: i8 [[A:%.*]]) !prof [[PROF0:![0-9]+]] {
|
|
; CHECK-NEXT: [[HEADER_BACKEDGE2:.*:]]
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 true, i1 true, i1 false, !prof [[PROF1:![0-9]+]]
|
|
; CHECK-NEXT: br label %[[HEADER:.*]]
|
|
; CHECK: [[HEADER]]:
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0
|
|
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 true, i1 [[CMP]], i1 false
|
|
; CHECK-NEXT: br i1 [[OR_COND]], label %[[EXIT:.*]], label %[[HEADER_BACKEDGE:.*]]
|
|
; CHECK: [[HEADER_BACKEDGE]]:
|
|
; CHECK-NEXT: br label %[[HEADER]]
|
|
; CHECK: [[EXIT]]:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
br label %header
|
|
|
|
header:
|
|
br i1 false, label %header, label %body
|
|
|
|
body:
|
|
%s = select i1 true, i1 true, i1 false, !prof !1
|
|
%cmp = icmp eq i8 %a, 0
|
|
br i1 %cmp, label %exit, label %header
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
!0 = !{!"function_entry_count", i64 1000}
|
|
!1 = !{!"branch_weights", i32 4, i32 1}
|
|
;.
|
|
; CHECK: [[PROF0]] = !{!"function_entry_count", i64 1000}
|
|
; CHECK: [[PROF1]] = !{!"unknown", !"LoopInfo"}
|
|
;.
|