diff options
Diffstat (limited to 'llvm')
12 files changed, 837 insertions, 94 deletions
diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected index 3b86c36..05e5777 100644 --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected @@ -36,7 +36,7 @@ exit: declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() ;. -; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4 +; CHECK: @G = external dso_local global i32, align 4 ;. ; CHECK-LABEL: @foo( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected index 30e1a68..db7c692 100644 --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected @@ -6,7 +6,7 @@ target triple = "x86_64-apple-macosx10.14.0" @G = external dso_local global i32, align 4 ;. -; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4 +; CHECK: @G = external dso_local global i32, align 4 ;. define void @foo(i32) { ; CHECK-LABEL: @foo( diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected index e6698db..0001790 100644 --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected @@ -37,7 +37,7 @@ exit: declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() ;. -; REUSE: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4 +; REUSE: @G = external dso_local global i32, align 4 ;. ; REUSE-LABEL: @foo( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected index 87f588d..17be222 100644 --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected @@ -7,7 +7,7 @@ target triple = "x86_64-apple-macosx10.14.0" @G = external dso_local global i32, align 4 ;. -; REUSE: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4 +; REUSE: @G = external dso_local global i32, align 4 ;. define void @foo(i32) { ; REUSE-LABEL: @foo( diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_regex.ll.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_regex.ll.expected index 089b62f..5cd3746 100644 --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_regex.ll.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_regex.ll.expected @@ -6,7 +6,7 @@ @Baz = global i32 2 ;. -; CHECK: @[[ONLYFOO:[a-zA-Z0-9_$"\\.-]+]] = global i32 1 +; CHECK: @OnlyFoo = global i32 1 ;. define i32 @t() { ; CHECK-LABEL: @t( diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.globals.expected index d71dc3e..ea35ec5 100644 --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.globals.expected @@ -250,67 +250,67 @@ attributes #3 = { nounwind } ; CHECK: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } ; CHECK: attributes #[[ATTR3]] = { nounwind } ;. -; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) -; CHECK: [[META1:![0-9]+]] = !DIFile(filename: "various_ir_values.c", directory: "/data/build/llvm-project") -; CHECK: [[META2:![0-9]+]] = !{} +; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: [[META1:![0-9]+]], producer: "{{.*}}clang version {{.*}}", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: [[META2:![0-9]+]], splitDebugInlining: false, nameTableKind: None) +; CHECK: [[META1]] = !DIFile(filename: "various_ir_values.c", directory: {{.*}}) +; CHECK: [[META2]] = !{} ; CHECK: [[META3:![0-9]+]] = !{i32 7, !"Dwarf Version", i32 4} ; CHECK: [[META4:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3} ; CHECK: [[META5:![0-9]+]] = !{i32 1, !"wchar_size", i32 4} -; CHECK: [[META6:![0-9]+]] = !{!"clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)"} -; CHECK: [[DBG7]] = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12) -; CHECK: [[META8:![0-9]+]] = !DISubroutineType(types: !9) -; CHECK: [[META9:![0-9]+]] = !{null, !10} -; CHECK: [[META10:![0-9]+]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64) -; CHECK: [[META11:![0-9]+]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -; CHECK: [[META12:![0-9]+]] = !{!13, !14} -; CHECK: [[META13]] = !DILocalVariable(name: "A", arg: 1, scope: !7, file: !1, line: 1, type: !10) -; CHECK: [[META14]] = !DILocalVariable(name: "i", scope: !15, file: !1, line: 3, type: !11) -; CHECK: [[META15:![0-9]+]] = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 3) +; CHECK: [[META6:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"} +; CHECK: [[DBG7]] = distinct !DISubprogram(name: "foo", scope: [[META1]], file: [[META1]], line: 1, type: [[META8:![0-9]+]], scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META12:![0-9]+]]) +; CHECK: [[META8]] = !DISubroutineType(types: [[META9:![0-9]+]]) +; CHECK: [[META9]] = !{null, [[META10:![0-9]+]]} +; CHECK: [[META10]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META11:![0-9]+]], size: 64) +; CHECK: [[META11]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +; CHECK: [[META12]] = !{[[META13]], [[META14]]} +; CHECK: [[META13]] = !DILocalVariable(name: "A", arg: 1, scope: [[DBG7]], file: [[META1]], line: 1, type: [[META10]]) +; CHECK: [[META14]] = !DILocalVariable(name: "i", scope: [[META15:![0-9]+]], file: [[META1]], line: 3, type: [[META11]]) +; CHECK: [[META15]] = distinct !DILexicalBlock(scope: [[DBG7]], file: [[META1]], line: 3, column: 3) ; CHECK: [[DIASSIGNID16]] = distinct !DIAssignID() -; CHECK: [[DBG17]] = !DILocation(line: 1, column: 15, scope: !7) -; CHECK: [[TBAA18]] = !{!19, !19, i64 0} -; CHECK: [[META19:![0-9]+]] = !{!"any pointer", !20, i64 0} -; CHECK: [[META20:![0-9]+]] = !{!"omnipotent char", !21, i64 0} -; CHECK: [[META21:![0-9]+]] = !{!"Simple C/C++ TBAA"} -; CHECK: [[DBG22]] = !DILocation(line: 3, column: 8, scope: !15) -; CHECK: [[DBG23]] = !DILocation(line: 3, column: 12, scope: !15) -; CHECK: [[TBAA24]] = !{!25, !25, i64 0} -; CHECK: [[META25:![0-9]+]] = !{!"int", !20, i64 0} -; CHECK: [[DBG26]] = !DILocation(line: 3, column: 19, scope: !27) -; CHECK: [[META27:![0-9]+]] = distinct !DILexicalBlock(scope: !15, file: !1, line: 3, column: 3) -; CHECK: [[DBG28]] = !DILocation(line: 3, column: 24, scope: !27) -; CHECK: [[DBG29]] = !DILocation(line: 3, column: 23, scope: !27) -; CHECK: [[DBG30]] = !DILocation(line: 3, column: 21, scope: !27) -; CHECK: [[DBG31]] = !DILocation(line: 3, column: 3, scope: !15) +; CHECK: [[DBG17]] = !DILocation(line: 1, column: 15, scope: [[DBG7]]) +; CHECK: [[TBAA18]] = !{[[META19:![0-9]+]], [[META19]], i64 0} +; CHECK: [[META19]] = !{!"any pointer", [[META20:![0-9]+]], i64 0} +; CHECK: [[META20]] = !{!"omnipotent char", [[META21:![0-9]+]], i64 0} +; CHECK: [[META21]] = !{!"Simple C/C++ TBAA"} +; CHECK: [[DBG22]] = !DILocation(line: 3, column: 8, scope: [[META15]]) +; CHECK: [[DBG23]] = !DILocation(line: 3, column: 12, scope: [[META15]]) +; CHECK: [[TBAA24]] = !{[[META25:![0-9]+]], [[META25]], i64 0} +; CHECK: [[META25]] = !{!"int", [[META20]], i64 0} +; CHECK: [[DBG26]] = !DILocation(line: 3, column: 19, scope: [[META27:![0-9]+]]) +; CHECK: [[META27]] = distinct !DILexicalBlock(scope: [[META15]], file: [[META1]], line: 3, column: 3) +; CHECK: [[DBG28]] = !DILocation(line: 3, column: 24, scope: [[META27]]) +; CHECK: [[DBG29]] = !DILocation(line: 3, column: 23, scope: [[META27]]) +; CHECK: [[DBG30]] = !DILocation(line: 3, column: 21, scope: [[META27]]) +; CHECK: [[DBG31]] = !DILocation(line: 3, column: 3, scope: [[META15]]) ; CHECK: [[PROF32]] = !{!"branch_weights", i32 1, i32 1048575} -; CHECK: [[DBG33]] = !DILocation(line: 3, column: 3, scope: !27) -; CHECK: [[DBG34]] = !DILocation(line: 4, column: 5, scope: !27) -; CHECK: [[DBG35]] = !DILocation(line: 4, column: 7, scope: !27) -; CHECK: [[DBG36]] = !DILocation(line: 4, column: 10, scope: !27) -; CHECK: [[DBG37]] = !DILocation(line: 3, column: 27, scope: !27) -; CHECK: [[LOOP38]] = distinct !{!38, !31, !39} -; CHECK: [[META39:![0-9]+]] = !DILocation(line: 4, column: 12, scope: !15) -; CHECK: [[DBG40]] = !DILocation(line: 5, column: 1, scope: !7) -; CHECK: [[DBG41]] = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 7, type: !8, scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !42) -; CHECK: [[META42:![0-9]+]] = !{!43, !44} -; CHECK: [[META43]] = !DILocalVariable(name: "A", arg: 1, scope: !41, file: !1, line: 7, type: !10) -; CHECK: [[META44]] = !DILocalVariable(name: "i", scope: !45, file: !1, line: 9, type: !11) -; CHECK: [[META45:![0-9]+]] = distinct !DILexicalBlock(scope: !41, file: !1, line: 9, column: 3) -; CHECK: [[DBG46]] = !DILocation(line: 7, column: 15, scope: !41) -; CHECK: [[DBG47]] = !DILocation(line: 9, column: 8, scope: !45) -; CHECK: [[DBG48]] = !DILocation(line: 9, column: 12, scope: !45) -; CHECK: [[DBG49]] = !DILocation(line: 9, column: 19, scope: !50) -; CHECK: [[META50:![0-9]+]] = distinct !DILexicalBlock(scope: !45, file: !1, line: 9, column: 3) -; CHECK: [[DBG51]] = !DILocation(line: 9, column: 24, scope: !50) -; CHECK: [[DBG52]] = !DILocation(line: 9, column: 23, scope: !50) -; CHECK: [[DBG53]] = !DILocation(line: 9, column: 21, scope: !50) -; CHECK: [[DBG54]] = !DILocation(line: 9, column: 3, scope: !45) -; CHECK: [[DBG55]] = !DILocation(line: 9, column: 3, scope: !50) -; CHECK: [[DBG56]] = !DILocation(line: 10, column: 5, scope: !50) -; CHECK: [[DBG57]] = !DILocation(line: 10, column: 7, scope: !50) -; CHECK: [[DBG58]] = !DILocation(line: 10, column: 10, scope: !50) -; CHECK: [[DBG59]] = !DILocation(line: 9, column: 27, scope: !50) -; CHECK: [[LOOP60]] = distinct !{!60, !54, !61} -; CHECK: [[META61:![0-9]+]] = !DILocation(line: 10, column: 12, scope: !45) -; CHECK: [[DBG62]] = !DILocation(line: 11, column: 1, scope: !41) +; CHECK: [[DBG33]] = !DILocation(line: 3, column: 3, scope: [[META27]]) +; CHECK: [[DBG34]] = !DILocation(line: 4, column: 5, scope: [[META27]]) +; CHECK: [[DBG35]] = !DILocation(line: 4, column: 7, scope: [[META27]]) +; CHECK: [[DBG36]] = !DILocation(line: 4, column: 10, scope: [[META27]]) +; CHECK: [[DBG37]] = !DILocation(line: 3, column: 27, scope: [[META27]]) +; CHECK: [[LOOP38]] = distinct !{[[LOOP38]], [[DBG31]], [[META39:![0-9]+]]} +; CHECK: [[META39]] = !DILocation(line: 4, column: 12, scope: [[META15]]) +; CHECK: [[DBG40]] = !DILocation(line: 5, column: 1, scope: [[DBG7]]) +; CHECK: [[DBG41]] = distinct !DISubprogram(name: "bar", scope: [[META1]], file: [[META1]], line: 7, type: [[META8]], scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META42:![0-9]+]]) +; CHECK: [[META42]] = !{[[META43]], [[META44]]} +; CHECK: [[META43]] = !DILocalVariable(name: "A", arg: 1, scope: [[DBG41]], file: [[META1]], line: 7, type: [[META10]]) +; CHECK: [[META44]] = !DILocalVariable(name: "i", scope: [[META45:![0-9]+]], file: [[META1]], line: 9, type: [[META11]]) +; CHECK: [[META45]] = distinct !DILexicalBlock(scope: [[DBG41]], file: [[META1]], line: 9, column: 3) +; CHECK: [[DBG46]] = !DILocation(line: 7, column: 15, scope: [[DBG41]]) +; CHECK: [[DBG47]] = !DILocation(line: 9, column: 8, scope: [[META45]]) +; CHECK: [[DBG48]] = !DILocation(line: 9, column: 12, scope: [[META45]]) +; CHECK: [[DBG49]] = !DILocation(line: 9, column: 19, scope: [[META50:![0-9]+]]) +; CHECK: [[META50]] = distinct !DILexicalBlock(scope: [[META45]], file: [[META1]], line: 9, column: 3) +; CHECK: [[DBG51]] = !DILocation(line: 9, column: 24, scope: [[META50]]) +; CHECK: [[DBG52]] = !DILocation(line: 9, column: 23, scope: [[META50]]) +; CHECK: [[DBG53]] = !DILocation(line: 9, column: 21, scope: [[META50]]) +; CHECK: [[DBG54]] = !DILocation(line: 9, column: 3, scope: [[META45]]) +; CHECK: [[DBG55]] = !DILocation(line: 9, column: 3, scope: [[META50]]) +; CHECK: [[DBG56]] = !DILocation(line: 10, column: 5, scope: [[META50]]) +; CHECK: [[DBG57]] = !DILocation(line: 10, column: 7, scope: [[META50]]) +; CHECK: [[DBG58]] = !DILocation(line: 10, column: 10, scope: [[META50]]) +; CHECK: [[DBG59]] = !DILocation(line: 9, column: 27, scope: [[META50]]) +; CHECK: [[LOOP60]] = distinct !{[[LOOP60]], [[DBG54]], [[META61:![0-9]+]]} +; CHECK: [[META61]] = !DILocation(line: 10, column: 12, scope: [[META45]]) +; CHECK: [[DBG62]] = !DILocation(line: 11, column: 1, scope: [[DBG41]]) ;. diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.noglobals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.noglobals.expected new file mode 100644 index 0000000..1ecb8b5 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.noglobals.expected @@ -0,0 +1,244 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; Just run it through opt, no passes needed. +; RUN: opt < %s -S | FileCheck %s + +; ModuleID = 'various_ir_values.c' +source_filename = "various_ir_values.c" +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; Function Attrs: nounwind uwtable +define dso_local void @foo(ptr %A) #0 !dbg !7 { +; CHECK-LABEL: @foo( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !DIAssignID [[DIASSIGNID16:![0-9]+]] +; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 +; CHECK-NEXT: call void @llvm.dbg.assign(metadata i1 undef, metadata [[META13:![0-9]+]], metadata !DIExpression(), metadata [[DIASSIGNID16]], metadata ptr [[A_ADDR]], metadata !DIExpression()), !dbg [[DBG17:![0-9]+]] +; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18:![0-9]+]] +; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[A_ADDR]], metadata [[META13]], metadata !DIExpression()), !dbg [[DBG17]] +; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3:[0-9]+]], !dbg [[DBG22:![0-9]+]] +; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META14:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23:![0-9]+]] +; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG23]], !tbaa [[TBAA24:![0-9]+]] +; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG22]] +; CHECK: for.cond: +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG26:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG28:![0-9]+]], !tbaa [[TBAA18]] +; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG29:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG30:![0-9]+]] +; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]] +; CHECK: for.cond.cleanup: +; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG33:![0-9]+]] +; CHECK-NEXT: br label [[FOR_END:%.*]] +; CHECK: for.body: +; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG34:![0-9]+]], !tbaa [[TBAA18]] +; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG35:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG34]] +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG34]] +; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG36:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG34]] +; CHECK: for.inc: +; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG37:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG37]] +; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG37]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]] +; CHECK: for.end: +; CHECK-NEXT: ret void, !dbg [[DBG40:![0-9]+]] +; +entry: + %A.addr = alloca ptr, align 8, !DIAssignID !62 + %i = alloca i32, align 4 + call void @llvm.dbg.assign(metadata i1 undef, metadata !13, metadata !DIExpression(), metadata !62, metadata ptr %A.addr, metadata !DIExpression()), !dbg !20 + store ptr %A, ptr %A.addr, align 8, !tbaa !16 + call void @llvm.dbg.declare(metadata ptr %A.addr, metadata !13, metadata !DIExpression()), !dbg !20 + call void @llvm.lifetime.start.p0(i64 4, ptr %i) #3, !dbg !21 + call void @llvm.dbg.declare(metadata ptr %i, metadata !14, metadata !DIExpression()), !dbg !22 + store i32 0, ptr %i, align 4, !dbg !22, !tbaa !23 + br label %for.cond, !dbg !21 + +for.cond: ; preds = %for.inc, %entry + %0 = load i32, ptr %i, align 4, !dbg !25, !tbaa !23 + %1 = load ptr, ptr %A.addr, align 8, !dbg !27, !tbaa !16 + %2 = load i32, ptr %1, align 4, !dbg !28, !tbaa !23 + %cmp = icmp slt i32 %0, %2, !dbg !29 + br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !30, !prof !61 + +for.cond.cleanup: ; preds = %for.cond + call void @llvm.lifetime.end.p0(i64 4, ptr %i) #3, !dbg !31 + br label %for.end + +for.body: ; preds = %for.cond + %3 = load ptr, ptr %A.addr, align 8, !dbg !32, !tbaa !16 + %4 = load i32, ptr %i, align 4, !dbg !33, !tbaa !23 + %idxprom = sext i32 %4 to i64, !dbg !32 + %arrayidx = getelementptr inbounds i32, ptr %3, i64 %idxprom, !dbg !32 + store i32 0, ptr %arrayidx, align 4, !dbg !34, !tbaa !23 + br label %for.inc, !dbg !32 + +for.inc: ; preds = %for.body + %5 = load i32, ptr %i, align 4, !dbg !35, !tbaa !23 + %inc = add nsw i32 %5, 1, !dbg !35 + store i32 %inc, ptr %i, align 4, !dbg !35, !tbaa !23 + br label %for.cond, !dbg !31, !llvm.loop !36 + +for.end: ; preds = %for.cond.cleanup + ret void, !dbg !38 +} + +; Function Attrs: nounwind readnone speculatable willreturn +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 + +; Function Attrs: argmemonly nounwind willreturn +declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2 + +; Function Attrs: argmemonly nounwind willreturn +declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2 + +; Function Attrs: nounwind uwtable +define dso_local void @bar(ptr %A) #0 !dbg !39 { +; CHECK-LABEL: @bar( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 +; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18]] +; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[A_ADDR]], metadata [[META43:![0-9]+]], metadata !DIExpression()), !dbg [[DBG46:![0-9]+]] +; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG47:![0-9]+]] +; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META44:![0-9]+]], metadata !DIExpression()), !dbg [[DBG48:![0-9]+]] +; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG48]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG47]] +; CHECK: for.cond: +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG49:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG51:![0-9]+]], !tbaa [[TBAA18]] +; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG52:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG53:![0-9]+]] +; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG54:![0-9]+]] +; CHECK: for.cond.cleanup: +; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG55:![0-9]+]] +; CHECK-NEXT: br label [[FOR_END:%.*]] +; CHECK: for.body: +; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG56:![0-9]+]], !tbaa [[TBAA18]] +; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG57:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG56]] +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG56]] +; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG58:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG56]] +; CHECK: for.inc: +; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG59:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG59]] +; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG59]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]] +; CHECK: for.end: +; CHECK-NEXT: ret void, !dbg [[DBG62:![0-9]+]] +; +entry: + %A.addr = alloca ptr, align 8 + %i = alloca i32, align 4 + store ptr %A, ptr %A.addr, align 8, !tbaa !16 + call void @llvm.dbg.declare(metadata ptr %A.addr, metadata !41, metadata !DIExpression()), !dbg !44 + call void @llvm.lifetime.start.p0(i64 4, ptr %i) #3, !dbg !45 + call void @llvm.dbg.declare(metadata ptr %i, metadata !42, metadata !DIExpression()), !dbg !46 + store i32 0, ptr %i, align 4, !dbg !46, !tbaa !23 + br label %for.cond, !dbg !45 + +for.cond: ; preds = %for.inc, %entry + %0 = load i32, ptr %i, align 4, !dbg !47, !tbaa !23 + %1 = load ptr, ptr %A.addr, align 8, !dbg !49, !tbaa !16 + %2 = load i32, ptr %1, align 4, !dbg !50, !tbaa !23 + %cmp = icmp slt i32 %0, %2, !dbg !51 + br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !52 + +for.cond.cleanup: ; preds = %for.cond + call void @llvm.lifetime.end.p0(i64 4, ptr %i) #3, !dbg !53 + br label %for.end + +for.body: ; preds = %for.cond + %3 = load ptr, ptr %A.addr, align 8, !dbg !54, !tbaa !16 + %4 = load i32, ptr %i, align 4, !dbg !55, !tbaa !23 + %idxprom = sext i32 %4 to i64, !dbg !54 + %arrayidx = getelementptr inbounds i32, ptr %3, i64 %idxprom, !dbg !54 + store i32 0, ptr %arrayidx, align 4, !dbg !56, !tbaa !23 + br label %for.inc, !dbg !54 + +for.inc: ; preds = %for.body + %5 = load i32, ptr %i, align 4, !dbg !57, !tbaa !23 + %inc = add nsw i32 %5, 1, !dbg !57 + store i32 %inc, ptr %i, align 4, !dbg !57, !tbaa !23 + br label %for.cond, !dbg !53, !llvm.loop !58 + +for.end: ; preds = %for.cond.cleanup + ret void, !dbg !60 +} + +declare void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata) + +attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="ieee,ieee" "denormal-fp-math-f32"="ieee,ieee" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone speculatable willreturn } +attributes #2 = { argmemonly nounwind willreturn } +attributes #3 = { nounwind } + +!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 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) +!1 = !DIFile(filename: "various_ir_values.c", directory: "/data/build/llvm-project") +!2 = !{} +!3 = !{i32 7, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{i32 1, !"wchar_size", i32 4} +!6 = !{!"clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)"} +!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12) +!8 = !DISubroutineType(types: !9) +!9 = !{null, !10} +!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64) +!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!12 = !{!13, !14} +!13 = !DILocalVariable(name: "A", arg: 1, scope: !7, file: !1, line: 1, type: !10) +!14 = !DILocalVariable(name: "i", scope: !15, file: !1, line: 3, type: !11) +!15 = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 3) +!16 = !{!17, !17, i64 0} +!17 = !{!"any pointer", !18, i64 0} +!18 = !{!"omnipotent char", !19, i64 0} +!19 = !{!"Simple C/C++ TBAA"} +!20 = !DILocation(line: 1, column: 15, scope: !7) +!21 = !DILocation(line: 3, column: 8, scope: !15) +!22 = !DILocation(line: 3, column: 12, scope: !15) +!23 = !{!24, !24, i64 0} +!24 = !{!"int", !18, i64 0} +!25 = !DILocation(line: 3, column: 19, scope: !26) +!26 = distinct !DILexicalBlock(scope: !15, file: !1, line: 3, column: 3) +!27 = !DILocation(line: 3, column: 24, scope: !26) +!28 = !DILocation(line: 3, column: 23, scope: !26) +!29 = !DILocation(line: 3, column: 21, scope: !26) +!30 = !DILocation(line: 3, column: 3, scope: !15) +!31 = !DILocation(line: 3, column: 3, scope: !26) +!32 = !DILocation(line: 4, column: 5, scope: !26) +!33 = !DILocation(line: 4, column: 7, scope: !26) +!34 = !DILocation(line: 4, column: 10, scope: !26) +!35 = !DILocation(line: 3, column: 27, scope: !26) +!36 = distinct !{!36, !30, !37} +!37 = !DILocation(line: 4, column: 12, scope: !15) +!38 = !DILocation(line: 5, column: 1, scope: !7) +!39 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 7, type: !8, scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !40) +!40 = !{!41, !42} +!41 = !DILocalVariable(name: "A", arg: 1, scope: !39, file: !1, line: 7, type: !10) +!42 = !DILocalVariable(name: "i", scope: !43, file: !1, line: 9, type: !11) +!43 = distinct !DILexicalBlock(scope: !39, file: !1, line: 9, column: 3) +!44 = !DILocation(line: 7, column: 15, scope: !39) +!45 = !DILocation(line: 9, column: 8, scope: !43) +!46 = !DILocation(line: 9, column: 12, scope: !43) +!47 = !DILocation(line: 9, column: 19, scope: !48) +!48 = distinct !DILexicalBlock(scope: !43, file: !1, line: 9, column: 3) +!49 = !DILocation(line: 9, column: 24, scope: !48) +!50 = !DILocation(line: 9, column: 23, scope: !48) +!51 = !DILocation(line: 9, column: 21, scope: !48) +!52 = !DILocation(line: 9, column: 3, scope: !43) +!53 = !DILocation(line: 9, column: 3, scope: !48) +!54 = !DILocation(line: 10, column: 5, scope: !48) +!55 = !DILocation(line: 10, column: 7, scope: !48) +!56 = !DILocation(line: 10, column: 10, scope: !48) +!57 = !DILocation(line: 9, column: 27, scope: !48) +!58 = distinct !{!58, !52, !59} +!59 = !DILocation(line: 10, column: 12, scope: !43) +!60 = !DILocation(line: 11, column: 1, scope: !39) +!61 = !{!"branch_weights", i32 1, i32 1048575} +!62 = distinct !DIAssignID() diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.transitiveglobals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.transitiveglobals.expected new file mode 100644 index 0000000..73d1705 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.transitiveglobals.expected @@ -0,0 +1,305 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart +; Just run it through opt, no passes needed. +; RUN: opt < %s -S | FileCheck %s + +; ModuleID = 'various_ir_values.c' +source_filename = "various_ir_values.c" +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; Function Attrs: nounwind uwtable +define dso_local void @foo(ptr %A) #0 !dbg !7 { +; CHECK-LABEL: @foo( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !DIAssignID [[DIASSIGNID16:![0-9]+]] +; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 +; CHECK-NEXT: call void @llvm.dbg.assign(metadata i1 undef, metadata [[META13:![0-9]+]], metadata !DIExpression(), metadata [[DIASSIGNID16]], metadata ptr [[A_ADDR]], metadata !DIExpression()), !dbg [[DBG17:![0-9]+]] +; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18:![0-9]+]] +; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[A_ADDR]], metadata [[META13]], metadata !DIExpression()), !dbg [[DBG17]] +; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3:[0-9]+]], !dbg [[DBG22:![0-9]+]] +; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META14:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23:![0-9]+]] +; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG23]], !tbaa [[TBAA24:![0-9]+]] +; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG22]] +; CHECK: for.cond: +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG26:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG28:![0-9]+]], !tbaa [[TBAA18]] +; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG29:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG30:![0-9]+]] +; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]] +; CHECK: for.cond.cleanup: +; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG33:![0-9]+]] +; CHECK-NEXT: br label [[FOR_END:%.*]] +; CHECK: for.body: +; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG34:![0-9]+]], !tbaa [[TBAA18]] +; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG35:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG34]] +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG34]] +; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG36:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG34]] +; CHECK: for.inc: +; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG37:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG37]] +; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG37]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]] +; CHECK: for.end: +; CHECK-NEXT: ret void, !dbg [[DBG40:![0-9]+]] +; +entry: + %A.addr = alloca ptr, align 8, !DIAssignID !62 + %i = alloca i32, align 4 + call void @llvm.dbg.assign(metadata i1 undef, metadata !13, metadata !DIExpression(), metadata !62, metadata ptr %A.addr, metadata !DIExpression()), !dbg !20 + store ptr %A, ptr %A.addr, align 8, !tbaa !16 + call void @llvm.dbg.declare(metadata ptr %A.addr, metadata !13, metadata !DIExpression()), !dbg !20 + call void @llvm.lifetime.start.p0(i64 4, ptr %i) #3, !dbg !21 + call void @llvm.dbg.declare(metadata ptr %i, metadata !14, metadata !DIExpression()), !dbg !22 + store i32 0, ptr %i, align 4, !dbg !22, !tbaa !23 + br label %for.cond, !dbg !21 + +for.cond: ; preds = %for.inc, %entry + %0 = load i32, ptr %i, align 4, !dbg !25, !tbaa !23 + %1 = load ptr, ptr %A.addr, align 8, !dbg !27, !tbaa !16 + %2 = load i32, ptr %1, align 4, !dbg !28, !tbaa !23 + %cmp = icmp slt i32 %0, %2, !dbg !29 + br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !30, !prof !61 + +for.cond.cleanup: ; preds = %for.cond + call void @llvm.lifetime.end.p0(i64 4, ptr %i) #3, !dbg !31 + br label %for.end + +for.body: ; preds = %for.cond + %3 = load ptr, ptr %A.addr, align 8, !dbg !32, !tbaa !16 + %4 = load i32, ptr %i, align 4, !dbg !33, !tbaa !23 + %idxprom = sext i32 %4 to i64, !dbg !32 + %arrayidx = getelementptr inbounds i32, ptr %3, i64 %idxprom, !dbg !32 + store i32 0, ptr %arrayidx, align 4, !dbg !34, !tbaa !23 + br label %for.inc, !dbg !32 + +for.inc: ; preds = %for.body + %5 = load i32, ptr %i, align 4, !dbg !35, !tbaa !23 + %inc = add nsw i32 %5, 1, !dbg !35 + store i32 %inc, ptr %i, align 4, !dbg !35, !tbaa !23 + br label %for.cond, !dbg !31, !llvm.loop !36 + +for.end: ; preds = %for.cond.cleanup + ret void, !dbg !38 +} + +; Function Attrs: nounwind readnone speculatable willreturn +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 + +; Function Attrs: argmemonly nounwind willreturn +declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2 + +; Function Attrs: argmemonly nounwind willreturn +declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2 + +; Function Attrs: nounwind uwtable +define dso_local void @bar(ptr %A) #0 !dbg !39 { +; CHECK-LABEL: @bar( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 +; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18]] +; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[A_ADDR]], metadata [[META43:![0-9]+]], metadata !DIExpression()), !dbg [[DBG46:![0-9]+]] +; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG47:![0-9]+]] +; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META44:![0-9]+]], metadata !DIExpression()), !dbg [[DBG48:![0-9]+]] +; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG48]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG47]] +; CHECK: for.cond: +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG49:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG51:![0-9]+]], !tbaa [[TBAA18]] +; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG52:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG53:![0-9]+]] +; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG54:![0-9]+]] +; CHECK: for.cond.cleanup: +; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG55:![0-9]+]] +; CHECK-NEXT: br label [[FOR_END:%.*]] +; CHECK: for.body: +; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG56:![0-9]+]], !tbaa [[TBAA18]] +; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG57:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG56]] +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG56]] +; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG58:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG56]] +; CHECK: for.inc: +; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG59:![0-9]+]], !tbaa [[TBAA24]] +; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG59]] +; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG59]], !tbaa [[TBAA24]] +; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]] +; CHECK: for.end: +; CHECK-NEXT: ret void, !dbg [[DBG62:![0-9]+]] +; +entry: + %A.addr = alloca ptr, align 8 + %i = alloca i32, align 4 + store ptr %A, ptr %A.addr, align 8, !tbaa !16 + call void @llvm.dbg.declare(metadata ptr %A.addr, metadata !41, metadata !DIExpression()), !dbg !44 + call void @llvm.lifetime.start.p0(i64 4, ptr %i) #3, !dbg !45 + call void @llvm.dbg.declare(metadata ptr %i, metadata !42, metadata !DIExpression()), !dbg !46 + store i32 0, ptr %i, align 4, !dbg !46, !tbaa !23 + br label %for.cond, !dbg !45 + +for.cond: ; preds = %for.inc, %entry + %0 = load i32, ptr %i, align 4, !dbg !47, !tbaa !23 + %1 = load ptr, ptr %A.addr, align 8, !dbg !49, !tbaa !16 + %2 = load i32, ptr %1, align 4, !dbg !50, !tbaa !23 + %cmp = icmp slt i32 %0, %2, !dbg !51 + br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !52 + +for.cond.cleanup: ; preds = %for.cond + call void @llvm.lifetime.end.p0(i64 4, ptr %i) #3, !dbg !53 + br label %for.end + +for.body: ; preds = %for.cond + %3 = load ptr, ptr %A.addr, align 8, !dbg !54, !tbaa !16 + %4 = load i32, ptr %i, align 4, !dbg !55, !tbaa !23 + %idxprom = sext i32 %4 to i64, !dbg !54 + %arrayidx = getelementptr inbounds i32, ptr %3, i64 %idxprom, !dbg !54 + store i32 0, ptr %arrayidx, align 4, !dbg !56, !tbaa !23 + br label %for.inc, !dbg !54 + +for.inc: ; preds = %for.body + %5 = load i32, ptr %i, align 4, !dbg !57, !tbaa !23 + %inc = add nsw i32 %5, 1, !dbg !57 + store i32 %inc, ptr %i, align 4, !dbg !57, !tbaa !23 + br label %for.cond, !dbg !53, !llvm.loop !58 + +for.end: ; preds = %for.cond.cleanup + ret void, !dbg !60 +} + +declare void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata) + +attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="ieee,ieee" "denormal-fp-math-f32"="ieee,ieee" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone speculatable willreturn } +attributes #2 = { argmemonly nounwind willreturn } +attributes #3 = { nounwind } + +!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 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) +!1 = !DIFile(filename: "various_ir_values.c", directory: "/data/build/llvm-project") +!2 = !{} +!3 = !{i32 7, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{i32 1, !"wchar_size", i32 4} +!6 = !{!"clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)"} +!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12) +!8 = !DISubroutineType(types: !9) +!9 = !{null, !10} +!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64) +!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!12 = !{!13, !14} +!13 = !DILocalVariable(name: "A", arg: 1, scope: !7, file: !1, line: 1, type: !10) +!14 = !DILocalVariable(name: "i", scope: !15, file: !1, line: 3, type: !11) +!15 = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 3) +!16 = !{!17, !17, i64 0} +!17 = !{!"any pointer", !18, i64 0} +!18 = !{!"omnipotent char", !19, i64 0} +!19 = !{!"Simple C/C++ TBAA"} +!20 = !DILocation(line: 1, column: 15, scope: !7) +!21 = !DILocation(line: 3, column: 8, scope: !15) +!22 = !DILocation(line: 3, column: 12, scope: !15) +!23 = !{!24, !24, i64 0} +!24 = !{!"int", !18, i64 0} +!25 = !DILocation(line: 3, column: 19, scope: !26) +!26 = distinct !DILexicalBlock(scope: !15, file: !1, line: 3, column: 3) +!27 = !DILocation(line: 3, column: 24, scope: !26) +!28 = !DILocation(line: 3, column: 23, scope: !26) +!29 = !DILocation(line: 3, column: 21, scope: !26) +!30 = !DILocation(line: 3, column: 3, scope: !15) +!31 = !DILocation(line: 3, column: 3, scope: !26) +!32 = !DILocation(line: 4, column: 5, scope: !26) +!33 = !DILocation(line: 4, column: 7, scope: !26) +!34 = !DILocation(line: 4, column: 10, scope: !26) +!35 = !DILocation(line: 3, column: 27, scope: !26) +!36 = distinct !{!36, !30, !37} +!37 = !DILocation(line: 4, column: 12, scope: !15) +!38 = !DILocation(line: 5, column: 1, scope: !7) +!39 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 7, type: !8, scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !40) +!40 = !{!41, !42} +!41 = !DILocalVariable(name: "A", arg: 1, scope: !39, file: !1, line: 7, type: !10) +!42 = !DILocalVariable(name: "i", scope: !43, file: !1, line: 9, type: !11) +!43 = distinct !DILexicalBlock(scope: !39, file: !1, line: 9, column: 3) +!44 = !DILocation(line: 7, column: 15, scope: !39) +!45 = !DILocation(line: 9, column: 8, scope: !43) +!46 = !DILocation(line: 9, column: 12, scope: !43) +!47 = !DILocation(line: 9, column: 19, scope: !48) +!48 = distinct !DILexicalBlock(scope: !43, file: !1, line: 9, column: 3) +!49 = !DILocation(line: 9, column: 24, scope: !48) +!50 = !DILocation(line: 9, column: 23, scope: !48) +!51 = !DILocation(line: 9, column: 21, scope: !48) +!52 = !DILocation(line: 9, column: 3, scope: !43) +!53 = !DILocation(line: 9, column: 3, scope: !48) +!54 = !DILocation(line: 10, column: 5, scope: !48) +!55 = !DILocation(line: 10, column: 7, scope: !48) +!56 = !DILocation(line: 10, column: 10, scope: !48) +!57 = !DILocation(line: 9, column: 27, scope: !48) +!58 = distinct !{!58, !52, !59} +!59 = !DILocation(line: 10, column: 12, scope: !43) +!60 = !DILocation(line: 11, column: 1, scope: !39) +!61 = !{!"branch_weights", i32 1, i32 1048575} +!62 = distinct !DIAssignID() +;. +; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: [[META1:![0-9]+]], producer: "{{.*}}clang version {{.*}}", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: [[META2:![0-9]+]], splitDebugInlining: false, nameTableKind: None) +; CHECK: [[META1]] = !DIFile(filename: "various_ir_values.c", directory: {{.*}}) +; CHECK: [[META2]] = !{} +; CHECK: [[META7:![0-9]+]] = distinct !DISubprogram(name: "foo", scope: [[META1]], file: [[META1]], line: 1, type: [[META8:![0-9]+]], scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META12:![0-9]+]]) +; CHECK: [[META8]] = !DISubroutineType(types: [[META9:![0-9]+]]) +; CHECK: [[META9]] = !{null, [[META10:![0-9]+]]} +; CHECK: [[META10]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META11:![0-9]+]], size: 64) +; CHECK: [[META11]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +; CHECK: [[META12]] = !{[[META13]], [[META14]]} +; CHECK: [[META13]] = !DILocalVariable(name: "A", arg: 1, scope: [[META7]], file: [[META1]], line: 1, type: [[META10]]) +; CHECK: [[META14]] = !DILocalVariable(name: "i", scope: [[META15:![0-9]+]], file: [[META1]], line: 3, type: [[META11]]) +; CHECK: [[META15]] = distinct !DILexicalBlock(scope: [[META7]], file: [[META1]], line: 3, column: 3) +; CHECK: [[DIASSIGNID16]] = distinct !DIAssignID() +; CHECK: [[DBG17]] = !DILocation(line: 1, column: 15, scope: [[META7]]) +; CHECK: [[TBAA18]] = !{[[META19:![0-9]+]], [[META19]], i64 0} +; CHECK: [[META19]] = !{!"any pointer", [[META20:![0-9]+]], i64 0} +; CHECK: [[META20]] = !{!"omnipotent char", [[META21:![0-9]+]], i64 0} +; CHECK: [[META21]] = !{!"Simple C/C++ TBAA"} +; CHECK: [[DBG22]] = !DILocation(line: 3, column: 8, scope: [[META15]]) +; CHECK: [[DBG23]] = !DILocation(line: 3, column: 12, scope: [[META15]]) +; CHECK: [[TBAA24]] = !{[[META25:![0-9]+]], [[META25]], i64 0} +; CHECK: [[META25]] = !{!"int", [[META20]], i64 0} +; CHECK: [[DBG26]] = !DILocation(line: 3, column: 19, scope: [[META27:![0-9]+]]) +; CHECK: [[META27]] = distinct !DILexicalBlock(scope: [[META15]], file: [[META1]], line: 3, column: 3) +; CHECK: [[DBG28]] = !DILocation(line: 3, column: 24, scope: [[META27]]) +; CHECK: [[DBG29]] = !DILocation(line: 3, column: 23, scope: [[META27]]) +; CHECK: [[DBG30]] = !DILocation(line: 3, column: 21, scope: [[META27]]) +; CHECK: [[DBG31]] = !DILocation(line: 3, column: 3, scope: [[META15]]) +; CHECK: [[PROF32]] = !{!"branch_weights", i32 1, i32 1048575} +; CHECK: [[DBG33]] = !DILocation(line: 3, column: 3, scope: [[META27]]) +; CHECK: [[DBG34]] = !DILocation(line: 4, column: 5, scope: [[META27]]) +; CHECK: [[DBG35]] = !DILocation(line: 4, column: 7, scope: [[META27]]) +; CHECK: [[DBG36]] = !DILocation(line: 4, column: 10, scope: [[META27]]) +; CHECK: [[DBG37]] = !DILocation(line: 3, column: 27, scope: [[META27]]) +; CHECK: [[LOOP38]] = distinct !{[[LOOP38]], [[DBG31]], [[META39:![0-9]+]]} +; CHECK: [[META39]] = !DILocation(line: 4, column: 12, scope: [[META15]]) +; CHECK: [[DBG40]] = !DILocation(line: 5, column: 1, scope: [[META7]]) +; CHECK: [[META41:![0-9]+]] = distinct !DISubprogram(name: "bar", scope: [[META1]], file: [[META1]], line: 7, type: [[META8]], scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META42:![0-9]+]]) +; CHECK: [[META42]] = !{[[META43]], [[META44]]} +; CHECK: [[META43]] = !DILocalVariable(name: "A", arg: 1, scope: [[META41]], file: [[META1]], line: 7, type: [[META10]]) +; CHECK: [[META44]] = !DILocalVariable(name: "i", scope: [[META45:![0-9]+]], file: [[META1]], line: 9, type: [[META11]]) +; CHECK: [[META45]] = distinct !DILexicalBlock(scope: [[META41]], file: [[META1]], line: 9, column: 3) +; CHECK: [[DBG46]] = !DILocation(line: 7, column: 15, scope: [[META41]]) +; CHECK: [[DBG47]] = !DILocation(line: 9, column: 8, scope: [[META45]]) +; CHECK: [[DBG48]] = !DILocation(line: 9, column: 12, scope: [[META45]]) +; CHECK: [[DBG49]] = !DILocation(line: 9, column: 19, scope: [[META50:![0-9]+]]) +; CHECK: [[META50]] = distinct !DILexicalBlock(scope: [[META45]], file: [[META1]], line: 9, column: 3) +; CHECK: [[DBG51]] = !DILocation(line: 9, column: 24, scope: [[META50]]) +; CHECK: [[DBG52]] = !DILocation(line: 9, column: 23, scope: [[META50]]) +; CHECK: [[DBG53]] = !DILocation(line: 9, column: 21, scope: [[META50]]) +; CHECK: [[DBG54]] = !DILocation(line: 9, column: 3, scope: [[META45]]) +; CHECK: [[DBG55]] = !DILocation(line: 9, column: 3, scope: [[META50]]) +; CHECK: [[DBG56]] = !DILocation(line: 10, column: 5, scope: [[META50]]) +; CHECK: [[DBG57]] = !DILocation(line: 10, column: 7, scope: [[META50]]) +; CHECK: [[DBG58]] = !DILocation(line: 10, column: 10, scope: [[META50]]) +; CHECK: [[DBG59]] = !DILocation(line: 9, column: 27, scope: [[META50]]) +; CHECK: [[LOOP60]] = distinct !{[[LOOP60]], [[DBG54]], [[META61:![0-9]+]]} +; CHECK: [[META61]] = !DILocation(line: 10, column: 12, scope: [[META45]]) +; CHECK: [[DBG62]] = !DILocation(line: 11, column: 1, scope: [[META41]]) +;. diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/various_ir_values.test b/llvm/test/tools/UpdateTestChecks/update_test_checks/various_ir_values.test index c65150e..c8483ff 100644 --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/various_ir_values.test +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/various_ir_values.test @@ -16,3 +16,9 @@ ## Also try the --check-globals flag # RUN: %update_test_checks %t.ll --check-globals # RUN: diff -u %t.ll %S/Inputs/various_ir_values.ll.funcsig.globals.expected +# RUN: cp -f %S/Inputs/various_ir_values.ll %t.ll && %update_test_checks %t.ll --function-signature --check-globals all +# RUN: diff -u %t.ll %S/Inputs/various_ir_values.ll.funcsig.globals.expected +# RUN: cp -f %S/Inputs/various_ir_values.ll %t.ll && %update_test_checks %t.ll --check-globals none +# RUN: diff -u %t.ll %S/Inputs/various_ir_values.ll.funcsig.noglobals.expected +# RUN: cp -f %S/Inputs/various_ir_values.ll %t.ll && %update_test_checks %t.ll --check-globals smart +# RUN: diff -u %t.ll %S/Inputs/various_ir_values.ll.funcsig.transitiveglobals.expected diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index 88b2ccc2..d1fd884 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -26,8 +26,10 @@ Version changelog: type/attributes. 3: Opening parenthesis of function args is kept on the first LABEL line in case arguments are split to a separate SAME line. +4: --check-globals now has a third option ('smart'). The others are now called + 'none' and 'all'. 'smart' is the default. """ -DEFAULT_VERSION = 3 +DEFAULT_VERSION = 4 class Regex(object): @@ -228,6 +230,8 @@ def parse_args(parser, argv): _verbose = args.verbose _global_value_regex = args.global_value_regex _global_hex_value_regex = args.global_hex_value_regex + if "check_globals" in args and args.check_globals == "default": + args.check_globals = "none" if args.version < 4 else "smart" return args @@ -332,8 +336,8 @@ def itertests( input_lines = [l.rstrip() for l in f] first_line = input_lines[0] if input_lines else "" if UTC_AVOID in first_line: - warn("Skipping test that must not be autogenerated: " + test) - continue + warn("Skipping test that must not be autogenerated: " + test) + continue is_regenerate = UTC_ADVERT in first_line # If we're generating a new test, set the default version to the latest. @@ -896,7 +900,9 @@ class NamelessValue: *, is_before_functions=False, is_number=False, - replace_number_with_counter=False + replace_number_with_counter=False, + match_literally=False, + interlaced_with_previous=False ): self.check_prefix = check_prefix self.check_key = check_key @@ -908,6 +914,8 @@ class NamelessValue: # Some variable numbers (e.g. MCINST1234) will change based on unrelated # modifications to LLVM, replace those with an incrementing counter. self.replace_number_with_counter = replace_number_with_counter + self.match_literally = match_literally + self.interlaced_with_previous = interlaced_with_previous self.variable_mapping = {} # Return true if this kind of IR value is "local", basically if it matches '%{{.*}}'. @@ -919,9 +927,10 @@ class NamelessValue: return self.global_ir_rhs_regexp is not None # Return the IR prefix and check prefix we use for this kind or IR value, - # e.g., (%, TMP) for locals. + # e.g., (%, TMP) for locals. If the IR prefix is a regex, return the prefix + # used in the IR output def get_ir_prefix_from_ir_value_match(self, match): - return self.ir_prefix, self.check_prefix + return re.search(self.ir_prefix, match[0])[0], self.check_prefix # Return the IR regexp we use for this kind or IR value, e.g., [\w.-]+? for locals def get_ir_regex_from_ir_value_re_match(self, match): @@ -990,8 +999,16 @@ ir_nameless_values = [ NamelessValue(r"ATTR", "#", r"#", r"[0-9]+", None), NamelessValue(r"ATTR", "#", r"attributes #", r"[0-9]+", r"{[^}]*}"), NamelessValue(r"GLOB", "@", r"@", r"[0-9]+", None), + NamelessValue(r"GLOB", "@", r"@", r"[0-9]+", r".+", is_before_functions=True), NamelessValue( - r"GLOB", "@", r"@", r'[a-zA-Z0-9_$"\\.-]+', r".+", is_before_functions=True + r"GLOBNAMED", + "@", + r"@", + r"[a-zA-Z0-9_$\"\\.-]*[a-zA-Z_$\"\\.-][a-zA-Z0-9_$\"\\.-]*", + r".+", + is_before_functions=True, + match_literally=True, + interlaced_with_previous=True, ), NamelessValue(r"DBG", "!", r"!dbg ", r"![0-9]+", None), NamelessValue(r"DIASSIGNID", "!", r"!DIAssignID ", r"![0-9]+", None), @@ -1003,6 +1020,19 @@ ir_nameless_values = [ NamelessValue(r"META", "!", r"metadata ", r"![0-9]+", None), NamelessValue(r"META", "!", r"", r"![0-9]+", r"(?:distinct |)!.*"), NamelessValue(r"ACC_GRP", "!", r"!llvm.access.group ", r"![0-9]+", None), + NamelessValue(r"META", "!", r"![a-z.]+ ", r"![0-9]+", None), +] + +global_nameless_values = [ + nameless_value + for nameless_value in ir_nameless_values + if nameless_value.global_ir_rhs_regexp is not None +] +# global variable names should be matched literally +global_nameless_values_w_unstable_ids = [ + nameless_value + for nameless_value in global_nameless_values + if not nameless_value.match_literally ] asm_nameless_values = [ @@ -1037,6 +1067,7 @@ analyze_nameless_values = [ ), ] + def createOrRegexp(old, new): if not old: return new @@ -1060,7 +1091,7 @@ for nameless_value in ir_nameless_values: if nameless_value.global_ir_rhs_regexp is not None: match = "^" + match IR_VALUE_REGEXP_STRING = createOrRegexp(IR_VALUE_REGEXP_STRING, match) -IR_VALUE_REGEXP_SUFFIX = r"([,\s\(\)]|\Z)" +IR_VALUE_REGEXP_SUFFIX = r"([,\s\(\)\}]|\Z)" IR_VALUE_RE = re.compile( IR_VALUE_REGEXP_PREFIX + r"(" @@ -1069,6 +1100,18 @@ IR_VALUE_RE = re.compile( + IR_VALUE_REGEXP_SUFFIX ) +GLOBAL_VALUE_REGEXP_STRING = r"" +for nameless_value in global_nameless_values_w_unstable_ids: + match = createPrefixMatch(nameless_value.ir_prefix, nameless_value.ir_regexp) + GLOBAL_VALUE_REGEXP_STRING = createOrRegexp(GLOBAL_VALUE_REGEXP_STRING, match) +GLOBAL_VALUE_RE = re.compile( + IR_VALUE_REGEXP_PREFIX + + r"(" + + GLOBAL_VALUE_REGEXP_STRING + + r")" + + IR_VALUE_REGEXP_SUFFIX +) + # Build the regexp that matches an "ASM value" (currently only for --asm-show-inst comments). ASM_VALUE_REGEXP_STRING = "" for nameless_value in asm_nameless_values: @@ -1101,6 +1144,7 @@ first_nameless_group_in_ir_value_match = 3 variable_group_in_ir_value_match = 3 attribute_group_in_ir_value_match = 4 + # Check a match for IR_VALUE_RE and inspect it to determine if it was a local # value, %..., global @..., debug number !dbg !..., etc. See the PREFIXES above. def get_idx_from_ir_value_match(match): @@ -1226,6 +1270,20 @@ def generalize_check_lines( ) +def generalize_global_check_line(line, preserve_names, global_vars_seen): + [new_line] = generalize_check_lines_common( + [line], + False, + set(), + global_vars_seen, + global_nameless_values_w_unstable_ids, + GLOBAL_VALUE_RE, + False, + preserve_names, + ) + return new_line + + def generalize_asm_check_lines(lines, vars_seen, global_vars_seen): return generalize_check_lines_common( lines, @@ -1251,6 +1309,7 @@ def generalize_analyze_check_lines(lines, vars_seen, global_vars_seen): False, ) + def add_checks( output_lines, comment_marker, @@ -1553,7 +1612,7 @@ def add_analyze_checks( def build_global_values_dictionary(glob_val_dict, raw_tool_output, prefixes): - for nameless_value in itertools.chain(ir_nameless_values, asm_nameless_values): + for nameless_value in itertools.chain(global_nameless_values, asm_nameless_values): if nameless_value.global_ir_rhs_regexp is None: continue @@ -1564,7 +1623,10 @@ def build_global_values_dictionary(glob_val_dict, raw_tool_output, prefixes): global_ir_value_re = re.compile(global_ir_value_re_str, flags=(re.M)) lines = [] for m in global_ir_value_re.finditer(raw_tool_output): - lines.append(m.group(0)) + # Attach the substring's start index so that CHECK lines + # can be sorted properly even if they are matched by different nameless values. + # This is relevant for GLOB and GLOBNAMED since they may appear interlaced. + lines.append((m.start(), m.group(0))) for prefix in prefixes: if glob_val_dict[prefix] is None: @@ -1580,6 +1642,86 @@ def build_global_values_dictionary(glob_val_dict, raw_tool_output, prefixes): glob_val_dict[prefix][nameless_value.check_prefix] = lines +def filter_globals_according_to_preference( + global_val_lines_w_index, global_vars_seen, nameless_value, global_check_setting +): + if global_check_setting == "none": + return [] + if global_check_setting == "all": + return global_val_lines_w_index + assert global_check_setting == "smart" + + if nameless_value.check_key == "#": + # attribute sets are usually better checked by --check-attributes + return [] + + def extract(line, nv): + p = ( + "^" + + nv.ir_prefix + + "(" + + nv.ir_regexp + + ") = (" + + nv.global_ir_rhs_regexp + + ")" + ) + match = re.match(p, line) + return (match.group(1), re.findall(nv.ir_regexp, match.group(2))) + + transitively_visible = set() + contains_refs_to = {} + + def add(var): + nonlocal transitively_visible + nonlocal contains_refs_to + if var in transitively_visible: + return + transitively_visible.add(var) + if not var in contains_refs_to: + return + for x in contains_refs_to[var]: + add(x) + + for i, line in global_val_lines_w_index: + (var, refs) = extract(line, nameless_value) + contains_refs_to[var] = refs + for var, check_key in global_vars_seen: + if check_key != nameless_value.check_key: + continue + add(var) + return [ + (i, line) + for i, line in global_val_lines_w_index + if extract(line, nameless_value)[0] in transitively_visible + ] + + +METADATA_FILTERS = [ + ( + r"(?<=\")(\w+ )?(\w+ version )[\d.]+(?: \([^)]+\))?", + r"{{.*}}\2{{.*}}", + ), # preface with glob also, to capture optional CLANG_VENDOR + (r'(!DIFile\(filename: ".+", directory: )".+"', r"\1{{.*}}"), +] +METADATA_FILTERS_RE = [(re.compile(f), r) for (f, r) in METADATA_FILTERS] + + +def filter_unstable_metadata(line): + for f, replacement in METADATA_FILTERS_RE: + line = f.sub(replacement, line) + return line + + +def flush_current_checks(output_lines, new_lines_w_index, comment_marker): + if not new_lines_w_index: + return + output_lines.append(comment_marker + SEPARATOR) + new_lines_w_index.sort() + for _, line in new_lines_w_index: + output_lines.append(line) + new_lines_w_index.clear() + + def add_global_checks( glob_val_dict, comment_marker, @@ -1588,11 +1730,11 @@ def add_global_checks( global_vars_seen_dict, preserve_names, is_before_functions, + global_check_setting, ): printed_prefixes = set() - for nameless_value in ir_nameless_values: - if nameless_value.global_ir_rhs_regexp is None: - continue + output_lines_loc = {} # Allows GLOB and GLOBNAMED to be sorted correctly + for nameless_value in global_nameless_values: if nameless_value.is_before_functions != is_before_functions: continue for p in prefix_list: @@ -1616,26 +1758,41 @@ def add_global_checks( check_lines = [] global_vars_seen_before = [key for key in global_vars_seen.keys()] - for line in glob_val_dict[checkprefix][nameless_value.check_prefix]: + lines_w_index = glob_val_dict[checkprefix][nameless_value.check_prefix] + lines_w_index = filter_globals_according_to_preference( + lines_w_index, + global_vars_seen_before, + nameless_value, + global_check_setting, + ) + for i, line in lines_w_index: if _global_value_regex: matched = False for regex in _global_value_regex: - if re.match("^@" + regex + " = ", line): + if re.match("^@" + regex + " = ", line) or re.match( + "^!" + regex + " = ", line + ): matched = True break if not matched: continue - tmp = generalize_check_lines( - [line], False, set(), global_vars_seen, preserve_names + new_line = generalize_global_check_line( + line, preserve_names, global_vars_seen ) - check_line = "%s %s: %s" % (comment_marker, checkprefix, tmp[0]) - check_lines.append(check_line) + new_line = filter_unstable_metadata(new_line) + check_line = "%s %s: %s" % (comment_marker, checkprefix, new_line) + check_lines.append((i, check_line)) if not check_lines: continue - output_lines.append(comment_marker + SEPARATOR) + if not checkprefix in output_lines_loc: + output_lines_loc[checkprefix] = [] + if not nameless_value.interlaced_with_previous: + flush_current_checks( + output_lines, output_lines_loc[checkprefix], comment_marker + ) for check_line in check_lines: - output_lines.append(check_line) + output_lines_loc[checkprefix].append(check_line) printed_prefixes.add((checkprefix, nameless_value.check_prefix)) @@ -1646,6 +1803,16 @@ def add_global_checks( break if printed_prefixes: + for p in prefix_list: + if p[0] is None: + continue + for checkprefix in p[0]: + if checkprefix not in output_lines_loc: + continue + flush_current_checks( + output_lines, output_lines_loc[checkprefix], comment_marker + ) + break output_lines.append(comment_marker + SEPARATOR) return printed_prefixes @@ -1712,6 +1879,15 @@ def get_autogennote_suffix(parser, args): ): continue value = getattr(args, action.dest) + if action.dest == "check_globals": + default_value = "none" if args.version < 4 else "smart" + if value == default_value: + continue + autogenerated_note_args += action.option_strings[0] + " " + if args.version < 4 and value == "all": + continue + autogenerated_note_args += "%s " % value + continue if action.const is not None: # action stores a constant (usually True/False) # Skip actions with different constant values (this happens with boolean # --foo/--no-foo options) diff --git a/llvm/utils/update_cc_test_checks.py b/llvm/utils/update_cc_test_checks.py index e96d416..28c6bb04 100755 --- a/llvm/utils/update_cc_test_checks.py +++ b/llvm/utils/update_cc_test_checks.py @@ -205,7 +205,10 @@ def config(): ) parser.add_argument( "--check-globals", - action="store_true", + nargs="?", + const="all", + default="default", + choices=["none", "smart", "all"], help="Check global entries (global variables, metadata, attribute sets, ...) for functions", ) parser.add_argument("tests", nargs="+") @@ -436,7 +439,7 @@ def main(): is_filtered=builder.is_filtered(), ) - if ti.args.check_globals: + if ti.args.check_globals != 'none': generated_prefixes.extend( common.add_global_checks( builder.global_var_dict(), @@ -444,8 +447,9 @@ def main(): run_list, output_lines, global_vars_seen_dict, + False, True, - True, + ti.args.check_globals, ) ) generated_prefixes.extend( @@ -493,7 +497,7 @@ def main(): output_lines.pop() last_line = output_lines[-1].strip() if ( - ti.args.check_globals + ti.args.check_globals != 'none' and not has_checked_pre_function_globals ): generated_prefixes.extend( @@ -503,8 +507,9 @@ def main(): run_list, output_lines, global_vars_seen_dict, + False, True, - True, + ti.args.check_globals, ) ) has_checked_pre_function_globals = True @@ -531,7 +536,7 @@ def main(): if include_line: output_lines.append(line.rstrip("\n")) - if ti.args.check_globals: + if ti.args.check_globals != 'none': generated_prefixes.extend( common.add_global_checks( builder.global_var_dict(), @@ -539,8 +544,9 @@ def main(): run_list, output_lines, global_vars_seen_dict, - True, False, + False, + ti.args.check_globals, ) ) if ti.args.gen_unused_prefix_body: diff --git a/llvm/utils/update_test_checks.py b/llvm/utils/update_test_checks.py index 56ff675..06c247c 100755 --- a/llvm/utils/update_test_checks.py +++ b/llvm/utils/update_test_checks.py @@ -79,7 +79,10 @@ def main(): ) parser.add_argument( "--check-globals", - action="store_true", + nargs="?", + const="all", + default="default", + choices=["none", "smart", "all"], help="Check global entries (global variables, metadata, attribute sets, ...) for functions", ) parser.add_argument("tests", nargs="+") @@ -195,7 +198,7 @@ def main(): common.dump_input_lines(output_lines, ti, prefix_set, ";") args = ti.args - if args.check_globals: + if args.check_globals != 'none': generated_prefixes.extend( common.add_global_checks( builder.global_var_dict(), @@ -205,6 +208,7 @@ def main(): global_vars_seen_dict, args.preserve_names, True, + args.check_globals, ) ) @@ -272,6 +276,7 @@ def main(): global_vars_seen_dict, args.preserve_names, True, + args.check_globals, ) ) has_checked_pre_function_globals = True @@ -301,7 +306,7 @@ def main(): continue is_in_function = is_in_function_start = True - if args.check_globals: + if args.check_globals != 'none': generated_prefixes.extend( common.add_global_checks( builder.global_var_dict(), @@ -311,6 +316,7 @@ def main(): global_vars_seen_dict, args.preserve_names, False, + args.check_globals, ) ) if ti.args.gen_unused_prefix_body: |