mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
6252c9b891
For basic blocks with instructions between the beginning of the block and a call we have to duplicate the instructions before the call in all split blocks and add PHI nodes for uses of the duplicated instructions after the call. Currently, the threshold for the number of instructions before a call is quite low, to keep the impact on binary size low. Reviewers: junbuml, mcrosier, davidxl, davide Reviewed By: junbuml Differential Revision: https://reviews.llvm.org/D41860 llvm-svn: 325126
57 lines
1.7 KiB
LLVM
57 lines
1.7 KiB
LLVM
; RUN: opt -S -callsite-splitting -o - < %s | FileCheck %s
|
|
; RUN: opt -S -strip-debug -callsite-splitting -o - < %s | FileCheck %s
|
|
|
|
define internal i16 @bar(i16 %p1, i16 %p2) {
|
|
%_tmp3 = mul i16 %p2, %p1
|
|
ret i16 %_tmp3
|
|
}
|
|
|
|
define i16 @foo(i16 %in) {
|
|
bb0:
|
|
br label %bb1
|
|
|
|
bb1:
|
|
%0 = icmp ne i16 %in, 0
|
|
br i1 %0, label %bb2, label %CallsiteBB
|
|
|
|
bb2:
|
|
br label %CallsiteBB
|
|
|
|
CallsiteBB:
|
|
%1 = phi i16 [ 0, %bb1 ], [ 1, %bb2 ]
|
|
%c = phi i16 [ 2, %bb1 ], [ 3, %bb2 ]
|
|
call void @llvm.dbg.value(metadata i16 %c, metadata !7, metadata !DIExpression()), !dbg !8
|
|
%2 = call i16 @bar(i16 %1, i16 5)
|
|
ret i16 %2
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone speculatable
|
|
declare void @llvm.dbg.value(metadata, metadata, metadata) #0
|
|
|
|
attributes #0 = { nounwind readnone speculatable }
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!2, !3}
|
|
!llvm.ident = !{!4}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "My Compiler")
|
|
!1 = !DIFile(filename: "foo.c", directory: "/bar")
|
|
!2 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!3 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!4 = !{!"My Compiler"}
|
|
!5 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_signed)
|
|
!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 4, unit: !0)
|
|
!7 = !DILocalVariable(name: "c", scope: !6, line: 5, type: !5)
|
|
!8 = !DILocation(line: 5, column: 7, scope: !6)
|
|
|
|
; The optimization should trigger even in the presence of the dbg.value in
|
|
; CallSiteBB.
|
|
|
|
; CHECK-LABEL: @foo
|
|
; CHECK-LABEL: bb1.split:
|
|
; CHECK: [[TMP1:%[0-9]+]] = call i16 @bar(i16 0, i16 5)
|
|
; CHECK-LABEL: bb2.split:
|
|
; CHECK: [[TMP2:%[0-9]+]] = call i16 @bar(i16 1, i16 5)
|
|
; CHECK-LABEL: CallsiteBB
|
|
; CHECK: %phi.call = phi i16 [ [[TMP2]], %bb2.split ], [ [[TMP1]], %bb1.split
|