findDominatingValue has a search limit, and when it is reached, optimization is not applied. This patch fixes the issue that this limit also takes into account debug intrinsics, so the result of optimization can depend from the presence of debug info.
43 lines
2.0 KiB
LLVM
43 lines
2.0 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
|
|
; RUN: opt < %s -passes=gvn -gvn-max-num-visited-insts=4 -S | FileCheck %s
|
|
|
|
declare void @llvm.dbg.declare(metadata, metadata, metadata)
|
|
|
|
define i32 @foo(ptr %a, ptr %b) {
|
|
; CHECK-LABEL: define i32 @foo(
|
|
; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A]], align 4
|
|
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr undef, metadata [[META4:![0-9]+]], metadata !DIExpression()), !dbg [[DBG10:![0-9]+]]
|
|
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B]], align 4
|
|
; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 [[TMP0]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[COND]], i32 [[TMP0]], i32 [[TMP1]]
|
|
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND]], ptr [[A]], ptr [[B]]
|
|
; CHECK-NEXT: ret i32 [[TMP2]]
|
|
;
|
|
entry:
|
|
%0 = load i32, ptr %a, align 4
|
|
call void @llvm.dbg.declare(metadata ptr undef, metadata !46, metadata !DIExpression()), !dbg !40
|
|
%1 = load i32, ptr %b, align 4
|
|
%cond = icmp slt i32 %0, %1
|
|
%ptr = select i1 %cond, ptr %a, ptr %b
|
|
%res = load i32, ptr %ptr, align 4
|
|
ret i32 %res
|
|
}
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!35, !36}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang version 17.0.0.prerel", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
|
|
!1 = !DIFile(filename: "bbi-78272.c", directory: "/tmp")
|
|
!5 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_signed)
|
|
|
|
!35 = !{i32 7, !"Dwarf Version", i32 4}
|
|
!36 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!40 = !DILocation(line: 15, column: 7, scope: !41)
|
|
!41 = distinct !DISubprogram(name: "x", scope: !1, file: !1, line: 14, type: !42, scopeLine: 14, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !45)
|
|
!42 = !DISubroutineType(types: !43)
|
|
!43 = !{!5}
|
|
!45 = !{!46}
|
|
!46 = !DILocalVariable(name: "t", scope: !41, file: !1, line: 15, type: !5)
|