| 
45 | 45 |   ret void  | 
46 | 46 | }  | 
47 | 47 | 
 
  | 
 | 48 | +declare i32 @getv()  | 
 | 49 | + | 
 | 50 | +; indirect.goto.dest2 should get hoisted, and that should not result  | 
 | 51 | +; in a loss of profiling info  | 
 | 52 | +define i32 @test19(i1 %cond, i1 %cond2, ptr %address, i32 %v1) nounwind {  | 
 | 53 | +; CHECK-LABEL: define i32 @test19  | 
 | 54 | +; CHECK-SAME: (i1 [[COND:%.*]], i1 [[COND2:%.*]], ptr [[ADDRESS:%.*]], i32 [[V1:%.*]]) #[[ATTR0:[0-9]+]] {  | 
 | 55 | +; CHECK-NEXT:  entry:  | 
 | 56 | +; CHECK-NEXT:    [[INDIRECT_GOTO_DEST:%.*]] = select i1 [[COND]], ptr blockaddress(@test19, [[EXIT:%.*]]), ptr [[ADDRESS]], !prof [[PROF9:![0-9]+]]  | 
 | 57 | +; CHECK-NEXT:    [[INDIRECT_GOTO_DEST2:%.*]] = select i1 [[COND2]], ptr blockaddress(@test19, [[EXIT]]), ptr [[ADDRESS]], !prof [[PROF10:![0-9]+]]  | 
 | 58 | +; CHECK-NEXT:    br label [[L0:%.*]]  | 
 | 59 | +; CHECK:       L0:  | 
 | 60 | +; CHECK-NEXT:    [[V2:%.*]] = call i32 @getv()  | 
 | 61 | +; CHECK-NEXT:    [[SINKABLE:%.*]] = mul i32 [[V1]], [[V2]]  | 
 | 62 | +; CHECK-NEXT:    [[SINKABLE2:%.*]] = add i32 [[V1]], [[V2]]  | 
 | 63 | +; CHECK-NEXT:    indirectbr ptr [[INDIRECT_GOTO_DEST]], [label [[L1:%.*]], label %exit]  | 
 | 64 | +; CHECK:       L1:  | 
 | 65 | +; CHECK-NEXT:    indirectbr ptr [[INDIRECT_GOTO_DEST2]], [label [[L0]], label %exit]  | 
 | 66 | +; CHECK:       exit:  | 
 | 67 | +; CHECK-NEXT:    [[R:%.*]] = phi i32 [ [[SINKABLE]], [[L0]] ], [ [[SINKABLE2]], [[L1]] ]  | 
 | 68 | +; CHECK-NEXT:    ret i32 [[R]]  | 
 | 69 | +;  | 
 | 70 | +entry:  | 
 | 71 | +  br label %L0  | 
 | 72 | +L0:  | 
 | 73 | +  %indirect.goto.dest = select i1 %cond, ptr blockaddress(@test19, %exit), ptr %address, !prof !10  | 
 | 74 | +  %v2 = call i32 @getv()  | 
 | 75 | +  %sinkable = mul i32 %v1, %v2  | 
 | 76 | +  %sinkable2 = add i32 %v1, %v2  | 
 | 77 | +  indirectbr ptr %indirect.goto.dest, [label %L1, label %exit]  | 
 | 78 | + | 
 | 79 | +L1:  | 
 | 80 | +  %indirect.goto.dest2 = select i1 %cond2, ptr blockaddress(@test19, %exit), ptr %address, !prof !11  | 
 | 81 | +  indirectbr ptr %indirect.goto.dest2, [label %L0, label %exit]  | 
 | 82 | + | 
 | 83 | +exit:  | 
 | 84 | +  %r = phi i32 [%sinkable, %L0], [%sinkable2, %L1]  | 
 | 85 | +  ret i32 %r  | 
 | 86 | +}  | 
 | 87 | + | 
48 | 88 | !llvm.module.flags = !{!2, !3}  | 
49 | 89 | 
 
  | 
50 | 90 | !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1)  | 
 | 
57 | 97 | !7 = !DILocation(line: 3, column: 22, scope: !4)  | 
58 | 98 | !8 = !{!"branch_weights", i32 5, i32 7}  | 
59 | 99 | !9 = !{!"branch_weights", i32 13, i32 11}  | 
 | 100 | +!10 = !{!"branch_weights", i32 101, i32 189}  | 
 | 101 | +!11 = !{!"branch_weights", i32 67, i32 1}  | 
 | 102 | +;.  | 
 | 103 | +; CHECK: attributes #[[ATTR0]] = { nounwind }  | 
60 | 104 | ;.  | 
61 | 105 | ; CHECK: [[META0:![0-9]+]] = !{i32 7, !"Dwarf Version", i32 5}  | 
62 | 106 | ; CHECK: [[META1:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}  | 
 | 
67 | 111 | ; CHECK: [[PROF6]] = !{!"branch_weights", i32 5, i32 7}  | 
68 | 112 | ; CHECK: [[DBG7]] = !DILocation(line: 3, column: 22, scope: [[META3]])  | 
69 | 113 | ; CHECK: [[PROF8]] = !{!"branch_weights", i32 13, i32 11}  | 
 | 114 | +; CHECK: [[PROF9]] = !{!"branch_weights", i32 101, i32 189}  | 
 | 115 | +; CHECK: [[PROF10]] = !{!"branch_weights", i32 67, i32 1}  | 
70 | 116 | ;.  | 
0 commit comments