| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs --version 6 |
| ; RUN: opt -S -passes=mergefunc < %s | FileCheck %s |
| |
| @llvm.used = appending global [2 x ptr] [ptr @odr_a, ptr @odr_b], section "llvm.metadata" |
| |
| define internal i32 @basic_a(i32 %x) !prof !12 { |
| entry: |
| %add = add nsw i32 %x, 1 |
| ret i32 %add |
| } |
| |
| define internal i32 @basic_b(i32 %x) !prof !12 { |
| entry: |
| %add = add nsw i32 %x, 1 |
| ret i32 %add |
| } |
| |
| define internal i32 @asym_a(i32 %x) !prof !13 { |
| entry: |
| %add = add nsw i32 %x, 2 |
| ret i32 %add |
| } |
| |
| define internal i32 @asym_b(i32 %x) !prof !14 { |
| entry: |
| %add = add nsw i32 %x, 2 |
| ret i32 %add |
| } |
| |
| define internal i32 @onesided_a(i32 %x) { |
| entry: |
| %add = add nsw i32 %x, 3 |
| ret i32 %add |
| } |
| |
| define internal i32 @onesided_b(i32 %x) !prof !15 { |
| entry: |
| %add = add nsw i32 %x, 3 |
| ret i32 %add |
| } |
| |
| define linkonce_odr i32 @odr_a(i32 %x) !prof !12 { |
| entry: |
| %add = add nsw i32 %x, 5 |
| ret i32 %add |
| } |
| |
| define linkonce_odr i32 @odr_b(i32 %x) !prof !12 { |
| entry: |
| %add = add nsw i32 %x, 5 |
| ret i32 %add |
| } |
| |
| define i32 @use_counts(i32 %x) { |
| entry: |
| %basic = call i32 @basic_a(i32 %x) |
| %basic2 = call i32 @basic_b(i32 %x) |
| %asym = call i32 @asym_a(i32 %x) |
| %asym2 = call i32 @asym_b(i32 %x) |
| %onesided = call i32 @onesided_a(i32 %x) |
| %onesided2 = call i32 @onesided_b(i32 %x) |
| %odr = call i32 @odr_a(i32 %x) |
| %odr2 = call i32 @odr_b(i32 %x) |
| %sum0 = add i32 %basic, %basic2 |
| %sum1 = add i32 %sum0, %asym |
| %sum2 = add i32 %sum1, %asym2 |
| %sum3 = add i32 %sum2, %onesided |
| %sum4 = add i32 %sum3, %onesided2 |
| %sum5 = add i32 %sum4, %odr |
| %sum6 = add i32 %sum5, %odr2 |
| ret i32 %sum6 |
| } |
| |
| !llvm.module.flags = !{!0} |
| |
| !0 = !{i32 1, !"ProfileSummary", !1} |
| !1 = !{!2, !3, !4, !5, !6, !7, !8, !9} |
| !2 = !{!"ProfileFormat", !"InstrProf"} |
| !3 = !{!"TotalCount", i64 3531} |
| !4 = !{!"MaxCount", i64 2000} |
| !5 = !{!"MaxInternalCount", i64 2000} |
| !6 = !{!"MaxFunctionCount", i64 2000} |
| !7 = !{!"NumCounts", i64 12} |
| !8 = !{!"NumFunctions", i64 12} |
| !9 = !{!"DetailedSummary", !10} |
| !10 = !{!11} |
| !11 = !{i32 10000, i64 1, i32 1} |
| !12 = !{!"function_entry_count", i64 1} |
| !13 = !{!"function_entry_count", i64 2000} |
| !14 = !{!"function_entry_count", i64 1000} |
| !15 = !{!"function_entry_count", i64 500} |
| ; CHECK-LABEL: define internal i32 @basic_a( |
| ; CHECK-SAME: i32 [[X:%.*]]) !prof [[PROF12:![0-9]+]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X]], 1 |
| ; CHECK-NEXT: ret i32 [[ADD]] |
| ; |
| ; |
| ; CHECK-LABEL: define internal i32 @asym_a( |
| ; CHECK-SAME: i32 [[X:%.*]]) !prof [[PROF13:![0-9]+]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X]], 2 |
| ; CHECK-NEXT: ret i32 [[ADD]] |
| ; |
| ; |
| ; CHECK-LABEL: define internal i32 @onesided_a( |
| ; CHECK-SAME: i32 [[X:%.*]]) !prof [[PROF14:![0-9]+]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X]], 3 |
| ; CHECK-NEXT: ret i32 [[ADD]] |
| ; |
| ; |
| ; CHECK-LABEL: define private i32 @0( |
| ; CHECK-SAME: i32 [[X:%.*]]) !prof [[PROF12]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X]], 5 |
| ; CHECK-NEXT: ret i32 [[ADD]] |
| ; |
| ; |
| ; CHECK-LABEL: define i32 @use_counts( |
| ; CHECK-SAME: i32 [[X:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[BASIC:%.*]] = call i32 @basic_a(i32 [[X]]) |
| ; CHECK-NEXT: [[BASIC2:%.*]] = call i32 @basic_a(i32 [[X]]) |
| ; CHECK-NEXT: [[ASYM:%.*]] = call i32 @asym_a(i32 [[X]]) |
| ; CHECK-NEXT: [[ASYM2:%.*]] = call i32 @asym_a(i32 [[X]]) |
| ; CHECK-NEXT: [[ONESIDED:%.*]] = call i32 @onesided_a(i32 [[X]]) |
| ; CHECK-NEXT: [[ONESIDED2:%.*]] = call i32 @onesided_a(i32 [[X]]) |
| ; CHECK-NEXT: [[ODR:%.*]] = call i32 @[[GLOB0:[0-9]+]](i32 [[X]]) |
| ; CHECK-NEXT: [[ODR2:%.*]] = call i32 @[[GLOB0]](i32 [[X]]) |
| ; CHECK-NEXT: [[SUM0:%.*]] = add i32 [[BASIC]], [[BASIC2]] |
| ; CHECK-NEXT: [[SUM1:%.*]] = add i32 [[SUM0]], [[ASYM]] |
| ; CHECK-NEXT: [[SUM2:%.*]] = add i32 [[SUM1]], [[ASYM2]] |
| ; CHECK-NEXT: [[SUM3:%.*]] = add i32 [[SUM2]], [[ONESIDED]] |
| ; CHECK-NEXT: [[SUM4:%.*]] = add i32 [[SUM3]], [[ONESIDED2]] |
| ; CHECK-NEXT: [[SUM5:%.*]] = add i32 [[SUM4]], [[ODR]] |
| ; CHECK-NEXT: [[SUM6:%.*]] = add i32 [[SUM5]], [[ODR2]] |
| ; CHECK-NEXT: ret i32 [[SUM6]] |
| ; |
| ; |
| ; CHECK-LABEL: define linkonce_odr i32 @odr_b( |
| ; CHECK-SAME: i32 [[TMP0:%.*]]) !prof [[PROF15:![0-9]+]] { |
| ; CHECK-NEXT: [[TMP2:%.*]] = tail call i32 @[[GLOB0]](i32 [[TMP0]]) |
| ; CHECK-NEXT: ret i32 [[TMP2]] |
| ; |
| ; |
| ; CHECK-LABEL: define linkonce_odr i32 @odr_a( |
| ; CHECK-SAME: i32 [[TMP0:%.*]]) !prof [[PROF15]] { |
| ; CHECK-NEXT: [[TMP2:%.*]] = tail call i32 @[[GLOB0]](i32 [[TMP0]]) |
| ; CHECK-NEXT: ret i32 [[TMP2]] |
| ; |
| ;. |
| ; CHECK: [[PROF12]] = !{!"function_entry_count", i64 2} |
| ; CHECK: [[PROF13]] = !{!"function_entry_count", i64 3000} |
| ; CHECK: [[PROF14]] = !{!"function_entry_count", i64 500} |
| ; CHECK: [[PROF15]] = !{!"function_entry_count", i64 1} |
| ;. |