1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00
llvm-mirror/test/Transforms/GVNHoist/hoist-pr31891.ll
Nikita Popov a78d45f1a3 [ValueTracking] Don't assume readonly function will return
This is similar to D94106, but for the
isGuaranteedToTransferExecutionToSuccessor() helper. We should not
assume that readonly functions will return, as this is only true for
mustprogress functions (in which case we already infer willreturn).
As with the DCE change, for now continue assuming that readonly
intrinsics will return, as not all target intrinsics have been
annotated yet.

Differential Revision: https://reviews.llvm.org/D95288
2021-01-24 10:40:21 +01:00

84 lines
3.4 KiB
LLVM

; RUN: opt -S -gvn-hoist < %s | FileCheck %s
; Hoisted inlinable calls need to have accurate scope information, but we're
; allowed to erase the line information.
source_filename = "t.c"
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.0.24215"
; Function Attrs: noinline nounwind readnone uwtable
define float @fabsf(float %f) #0 !dbg !7 {
entry:
%conv = fpext float %f to double, !dbg !9
%call = call double @fabs(double %conv) #1, !dbg !10
%conv1 = fptrunc double %call to float, !dbg !11
ret float %conv1, !dbg !12
}
; Function Attrs: nounwind readnone
declare double @fabs(double) #1
; Function Attrs: noinline nounwind uwtable
define void @hoistit(i32 %cond, float %f) #2 !dbg !13 {
entry:
%tobool = icmp ne i32 %cond, 0, !dbg !14
br i1 %tobool, label %if.then, label %if.else, !dbg !14
if.then: ; preds = %entry
%call = call float @fabsf(float %f) #1, !dbg !15
call void @useit1(float %call), !dbg !16
br label %if.end, !dbg !18
if.else: ; preds = %entry
%call1 = call float @fabsf(float %f) #1, !dbg !19
call void @useit2(float %call1), !dbg !20
br label %if.end
if.end: ; preds = %if.else, %if.then
ret void, !dbg !21
}
; CHECK-LABEL: define void @hoistit
; CHECK-SAME: !dbg ![[sp_hoistit:[0-9]+]]
; CHECK: call float @fabsf(float %f) {{.*}} !dbg ![[dbgloc:[0-9]+]]
; CHECK: br i1 %tobool, label %if.then, label %if.else
; CHECK: ![[sp_hoistit]] = distinct !DISubprogram(name: "hoistit", {{.*}})
; CHECK: ![[dbgloc]] = !DILocation({{.*}}, scope: ![[sp_hoistit]])
declare void @useit1(float)
declare void @useit2(float)
attributes #0 = { noinline nounwind readnone uwtable }
attributes #1 = { nounwind readnone willreturn }
attributes #2 = { noinline nounwind uwtable }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4, !5}
!llvm.ident = !{!6}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 5.0.0 ", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
!1 = !DIFile(filename: "t.c", directory: "C:\5Csrc\5Cllvm\5Cbuild")
!2 = !{}
!3 = !{i32 2, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{i32 1, !"PIC Level", i32 2}
!6 = !{!"clang version 5.0.0 "}
!7 = distinct !DISubprogram(name: "fabsf", scope: !1, file: !1, line: 4, type: !8, isLocal: false, isDefinition: true, scopeLine: 4, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
!8 = !DISubroutineType(types: !2)
!9 = !DILocation(line: 5, column: 22, scope: !7)
!10 = !DILocation(line: 5, column: 17, scope: !7)
!11 = !DILocation(line: 5, column: 10, scope: !7)
!12 = !DILocation(line: 5, column: 3, scope: !7)
!13 = distinct !DISubprogram(name: "hoistit", scope: !1, file: !1, line: 7, type: !8, isLocal: false, isDefinition: true, scopeLine: 7, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
!14 = !DILocation(line: 8, column: 7, scope: !13)
!15 = !DILocation(line: 9, column: 12, scope: !13)
!16 = !DILocation(line: 9, column: 5, scope: !17)
!17 = !DILexicalBlockFile(scope: !13, file: !1, discriminator: 1)
!18 = !DILocation(line: 10, column: 3, scope: !13)
!19 = !DILocation(line: 11, column: 12, scope: !13)
!20 = !DILocation(line: 11, column: 5, scope: !17)
!21 = !DILocation(line: 13, column: 1, scope: !13)