mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
6a71add7f0
Summary: The test case started to hoist bitcasts to upper BB after D81730. Reverted unintentional logic change. Some instructions may have zero cost but will not be hoisted by different limitation so should be counted for threshold. Reviewers: aprantl, arsenm, nhaehnle Reviewed By: aprantl Subscribers: wdng, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D82761
94 lines
3.7 KiB
LLVM
94 lines
3.7 KiB
LLVM
; RUN: opt < %s -S -speculative-execution | FileCheck %s
|
|
; RUN: opt < %s -S -passes='speculative-execution' | FileCheck %s
|
|
|
|
%class.B = type { i32 (...)** }
|
|
|
|
; Testing that two bitcasts are not hoisted to the first BB
|
|
define i8* @foo(%class.B* readonly %b) {
|
|
; CHECK-LABEL: foo
|
|
; CHECK-LABEL: entry
|
|
; CHECK-NEXT: %i = icmp eq %class.B* %b, null
|
|
; CHECK-NEXT: br i1 %i, label %end, label %notnull
|
|
entry:
|
|
%i = icmp eq %class.B* %b, null
|
|
br i1 %i, label %end, label %notnull
|
|
|
|
; CHECK-LABEL: notnull:
|
|
; CHECK-NEXT: %i1 = bitcast %class.B* %b to i32**
|
|
; CHECK: %i3 = bitcast %class.B* %b to i8*
|
|
notnull: ; preds = %entry
|
|
%i1 = bitcast %class.B* %b to i32**
|
|
%vtable = load i32*, i32** %i1, align 8
|
|
%i2 = getelementptr inbounds i32, i32* %vtable, i64 -2
|
|
%offset.to.top = load i32, i32* %i2, align 4
|
|
%i3 = bitcast %class.B* %b to i8*
|
|
%i4 = sext i32 %offset.to.top to i64
|
|
%i5 = getelementptr inbounds i8, i8* %i3, i64 %i4
|
|
br label %end
|
|
|
|
end: ; preds = %notnull, %entry
|
|
%i6 = phi i8* [ %i5, %notnull ], [ null, %entry ]
|
|
ret i8* %i6
|
|
}
|
|
|
|
define void @f(i32 %i) {
|
|
entry:
|
|
; CHECK-LABEL: @f(
|
|
; CHECK: %a2 = add i32 %i, 0
|
|
; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %a2
|
|
br i1 undef, label %land.rhs, label %land.end
|
|
|
|
land.rhs: ; preds = %entry
|
|
; CHECK: land.rhs:
|
|
; CHECK-NEXT: call void @llvm.dbg.label
|
|
; CHECK-NEXT: %x = alloca i32, align 4
|
|
; CHECK-NEXT: call void @llvm.dbg.addr(metadata i32* %x
|
|
; CHECK-NEXT: %y = alloca i32, align 4
|
|
; CHECK-NEXT: call void @llvm.dbg.declare(metadata i32* %y
|
|
; CHECK-NEXT: %a0 = load i32, i32* undef, align 1
|
|
; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %a0
|
|
call void @llvm.dbg.label(metadata !11), !dbg !10
|
|
%x = alloca i32, align 4
|
|
call void @llvm.dbg.addr(metadata i32* %x, metadata !12, metadata !DIExpression()), !dbg !10
|
|
%y = alloca i32, align 4
|
|
call void @llvm.dbg.declare(metadata i32* %y, metadata !14, metadata !DIExpression()), !dbg !10
|
|
|
|
%a0 = load i32, i32* undef, align 1
|
|
call void @llvm.dbg.value(metadata i32 %a0, metadata !9, metadata !DIExpression()), !dbg !10
|
|
|
|
%a2 = add i32 %i, 0
|
|
call void @llvm.dbg.value(metadata i32 %a2, metadata !13, metadata !DIExpression()), !dbg !10
|
|
|
|
br label %land.end
|
|
|
|
land.end: ; preds = %land.rhs, %entry
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone speculatable willreturn
|
|
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
|
|
declare void @llvm.dbg.label(metadata)
|
|
declare void @llvm.dbg.declare(metadata, metadata, metadata)
|
|
declare void @llvm.dbg.addr(metadata, metadata, metadata)
|
|
|
|
attributes #1 = { nounwind readnone speculatable willreturn }
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!5}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 11.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, splitDebugInlining: false, nameTableKind: None)
|
|
!1 = !DIFile(filename: "foo.c", directory: "/bar")
|
|
!2 = !{}
|
|
!3 = !{!4}
|
|
!4 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_signed)
|
|
!5 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!6 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !7, scopeLine: 2, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
|
|
!7 = !DISubroutineType(types: !8)
|
|
!8 = !{null}
|
|
!9 = !DILocalVariable(name: "a0", scope: !6, file: !1, line: 3, type: !4)
|
|
!10 = !DILocation(line: 0, scope: !6)
|
|
!11 = !DILabel(scope: !6, name: "label", file: !1, line: 1)
|
|
!12 = !DILocalVariable(name: "x", scope: !6, file: !1, line: 3, type: !4)
|
|
!13 = !DILocalVariable(name: "a2", scope: !6, file: !1, line: 3, type: !4)
|
|
!14 = !DILocalVariable(name: "y", scope: !6, file: !1, line: 3, type: !4)
|