| ; 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) | 
 |   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} | 
 |  | 
 | ;. | 
 | ; SINK: [[PROF0]] = !{!"branch_weights", i32 10} | 
 | ;. |