63 lines
2.2 KiB
LLVM
63 lines
2.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2
|
|
; RUN: opt < %s -passes='simplifycfg<sink-common-insts;no-hoist-common-insts>' -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s --check-prefix=SINK
|
|
|
|
|
|
; Test case based on the following C++ code with manualy annotated !prof metadata.
|
|
; This is to test that when calls to 'func1' from 'if.then' and 'if.else' are
|
|
; sinked, the branch weights are merged and attached to sinked call.
|
|
;
|
|
; int func1(int a, int b) ;
|
|
; int func2(int a, int b) ;
|
|
|
|
; int func(int a, int b, bool c) {
|
|
; int sum = 0;
|
|
; if (c) {
|
|
; sum += func1(a,b);
|
|
; } else {
|
|
; b -= func2(a,b);
|
|
; sum += func1(a,b);
|
|
; }
|
|
; return sum;
|
|
; }
|
|
|
|
define i32 @_Z4funciib(i32 %a, i32 %b, i1 %c) {
|
|
; SINK-LABEL: define i32 @_Z4funciib
|
|
; SINK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i1 [[C:%.*]]) {
|
|
; SINK-NEXT: entry:
|
|
; SINK-NEXT: br i1 [[C]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]]
|
|
; SINK: if.else:
|
|
; SINK-NEXT: [[CALL1:%.*]] = tail call i32 @_Z5func2ii(i32 [[A]], i32 [[B]])
|
|
; SINK-NEXT: [[SUB:%.*]] = sub i32 [[B]], [[CALL1]]
|
|
; SINK-NEXT: br label [[IF_END]]
|
|
; SINK: if.end:
|
|
; SINK-NEXT: [[SUB_SINK:%.*]] = phi i32 [ [[SUB]], [[IF_ELSE]] ], [ [[B]], [[ENTRY:%.*]] ]
|
|
; SINK-NEXT: [[CALL2:%.*]] = tail call i32 @_Z5func1ii(i32 [[A]], i32 [[SUB_SINK]]), !prof [[PROF0:![0-9]+]]
|
|
; SINK-NEXT: ret i32 [[CALL2]]
|
|
;
|
|
entry:
|
|
br i1 %c, label %if.then, label %if.else
|
|
|
|
if.then: ; preds = %entry
|
|
%call = tail call i32 @_Z5func1ii(i32 %a, i32 %b), !prof !0
|
|
br label %if.end
|
|
|
|
if.else: ; preds = %entry
|
|
%call1 = tail call i32 @_Z5func2ii(i32 %a, i32 %b)
|
|
%sub = sub i32 %b, %call1
|
|
%call2 = tail call i32 @_Z5func1ii(i32 %a, i32 %sub), !prof !1
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %if.else, %if.then
|
|
%sum.0 = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
|
|
ret i32 %sum.0
|
|
}
|
|
|
|
declare i32 @_Z5func1ii(i32, i32)
|
|
|
|
declare i32 @_Z5func2ii(i32, i32)
|
|
|
|
!0 = !{!"branch_weights", i32 10}
|
|
!1 = !{!"branch_weights", i32 90}
|
|
;.
|
|
; SINK: [[PROF0]] = !{!"branch_weights", i64 100}
|
|
;.
|