| # This test case has been reduced from one of the files from nullstone benchmark. | |
| # It verifies that no stalls are being missed when compiling with '-g'. | |
| # REQUIRES: asserts | |
| # RUN: llc -march=hexagon -mcpu=hexagonv73 -run-pass=global-sched -debug-only=global_sched %s -o /dev/null 2>&1 | FileCheck %s | |
| # CHECK: bb.3: | |
| # CHECK: Could not move packetized instr. | |
| # CHECK-NEXT: Not a single candidate fit. | |
| # CHECK: Home iterator moved to new BB(2) | |
| # CHECH-NOT: Want to move dependent op: S4_storeirif_io | |
| --- | | |
| %struct._Dnk_filet = type { i16, i8, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, [2 x i32], ptr, ptr, ptr, %struct._Mbstatet, ptr, [8 x i8], i8 } | |
| %struct._Mbstatet = type { i32, i16, i16 } | |
| @datafileptr = external dso_local local_unnamed_addr global ptr, align 4 | |
| @_Stderr = external dso_local global %struct._Dnk_filet, align 4 | |
| @.str = private unnamed_addr constant [49 x i8] c"ERROR: File=%s, Line=%d, Data file is not open.\0A\00", align 1, !dbg !0 | |
| @.str.1 = private unnamed_addr constant [6 x i8] c"fem.c\00", align 1, !dbg !7 | |
| @.str.2 = private unnamed_addr constant [28 x i8] c"%s=\09\09File=%s, Line=%d, %s.\0A\00", align 1, !dbg !12 | |
| @.str.3 = private unnamed_addr constant [6 x i8] c"error\00", align 1, !dbg !17 | |
| @.str.4 = private unnamed_addr constant [56 x i8] c"ERROR: File=%s, Line=%d, Unable to write to data file.\0A\00", align 1, !dbg !19 | |
| ; Function Attrs: noreturn nounwind | |
| define dso_local void @fatal_error_message(ptr noundef %filename, i32 noundef %line, ptr noundef %message) local_unnamed_addr #0 !dbg !31 { | |
| entry: | |
| call void @llvm.dbg.value(metadata ptr %filename, metadata !37, metadata !DIExpression()), !dbg !41 | |
| call void @llvm.dbg.value(metadata i32 %line, metadata !38, metadata !DIExpression()), !dbg !41 | |
| call void @llvm.dbg.value(metadata ptr %message, metadata !39, metadata !DIExpression()), !dbg !41 | |
| call void @llvm.dbg.value(metadata i32 0, metadata !40, metadata !DIExpression()), !dbg !41 | |
| %0 = load ptr, ptr @datafileptr, align 4, !dbg !42, !tbaa !44 | |
| %cmp = icmp eq ptr %0, null, !dbg !48 | |
| br i1 %cmp, label %if.end5.sink.split, label %if.end, !dbg !49 | |
| if.end: ; preds = %entry | |
| %call1 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef nonnull %0, ptr noundef nonnull @.str.2, ptr noundef nonnull @.str.3, ptr noundef %filename, i32 noundef %line, ptr noundef %message) #4, !dbg !50 | |
| call void @llvm.dbg.value(metadata i32 %call1, metadata !40, metadata !DIExpression()), !dbg !41 | |
| %cmp2 = icmp eq i32 %call1, -1, !dbg !51 | |
| br i1 %cmp2, label %if.end5.sink.split, label %if.end5, !dbg !53 | |
| if.end5.sink.split: ; preds = %if.end, %entry | |
| %.sink = phi i32 [ 30, %entry ], [ 37, %if.end ] | |
| %.str.sink = phi ptr [ @.str, %entry ], [ @.str.4, %if.end ] | |
| %call = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef nonnull @_Stderr, ptr noundef nonnull %.str.sink, ptr noundef nonnull @.str.1, i32 noundef %.sink) #4, !dbg !41 | |
| br label %if.end5, !dbg !54 | |
| if.end5: ; preds = %if.end5.sink.split, %if.end | |
| tail call void @exit(i32 noundef 1) #5, !dbg !54 | |
| unreachable, !dbg !54 | |
| } | |
| ; Function Attrs: nofree nounwind | |
| declare !dbg !55 dso_local noundef i32 @fprintf(ptr nocapture noundef, ptr nocapture noundef readonly, ...) local_unnamed_addr #1 | |
| ; Function Attrs: noreturn | |
| declare !dbg !104 dso_local void @exit(i32 noundef) local_unnamed_addr #2 | |
| ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) | |
| declare void @llvm.dbg.value(metadata, metadata, metadata) #3 | |
| attributes #0 = { noreturn nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="hexagonv73" "target-features"="+v73,-long-calls" } | |
| attributes #1 = { nofree nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="hexagonv73" "target-features"="+v73,-long-calls" } | |
| attributes #2 = { noreturn "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="hexagonv73" "target-features"="+v73,-long-calls" } | |
| attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } | |
| attributes #4 = { nounwind } | |
| attributes #5 = { noreturn nounwind } | |
| !llvm.dbg.cu = !{!24} | |
| !llvm.module.flags = !{!26, !27, !28, !29} | |
| !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) | |
| !1 = distinct !DIGlobalVariable(scope: null, file: !2, line: 29, type: !3, isLocal: true, isDefinition: true) | |
| !2 = !DIFile(filename: "fem.c", directory: "/tmp/build/v66/benchmark/nullstone/nullstone") | |
| !3 = !DICompositeType(tag: DW_TAG_array_type, baseType: !4, size: 392, elements: !5) | |
| !4 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_unsigned_char) | |
| !5 = !{!6} | |
| !6 = !DISubrange(count: 49) | |
| !7 = !DIGlobalVariableExpression(var: !8, expr: !DIExpression()) | |
| !8 = distinct !DIGlobalVariable(scope: null, file: !2, line: 30, type: !9, isLocal: true, isDefinition: true) | |
| !9 = !DICompositeType(tag: DW_TAG_array_type, baseType: !4, size: 48, elements: !10) | |
| !10 = !{!11} | |
| !11 = !DISubrange(count: 6) | |
| !12 = !DIGlobalVariableExpression(var: !13, expr: !DIExpression()) | |
| !13 = distinct !DIGlobalVariable(scope: null, file: !2, line: 33, type: !14, isLocal: true, isDefinition: true) | |
| !14 = !DICompositeType(tag: DW_TAG_array_type, baseType: !4, size: 224, elements: !15) | |
| !15 = !{!16} | |
| !16 = !DISubrange(count: 28) | |
| !17 = !DIGlobalVariableExpression(var: !18, expr: !DIExpression()) | |
| !18 = distinct !DIGlobalVariable(scope: null, file: !2, line: 34, type: !9, isLocal: true, isDefinition: true) | |
| !19 = !DIGlobalVariableExpression(var: !20, expr: !DIExpression()) | |
| !20 = distinct !DIGlobalVariable(scope: null, file: !2, line: 36, type: !21, isLocal: true, isDefinition: true) | |
| !21 = !DICompositeType(tag: DW_TAG_array_type, baseType: !4, size: 448, elements: !22) | |
| !22 = !{!23} | |
| !23 = !DISubrange(count: 56) | |
| !24 = distinct !DICompileUnit(language: DW_LANG_C11, file: !2, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: !25, splitDebugInlining: false, debugInfoForProfiling: true, nameTableKind: None) | |
| !25 = !{!0, !7, !12, !17, !19} | |
| !26 = !{i32 7, !"Dwarf Version", i32 4} | |
| !27 = !{i32 2, !"Debug Info Version", i32 3} | |
| !28 = !{i32 1, !"wchar_size", i32 4} | |
| !29 = !{i32 7, !"frame-pointer", i32 2} | |
| !31 = distinct !DISubprogram(name: "fatal_error_message", scope: !2, file: !2, line: 24, type: !32, scopeLine: 25, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !24, retainedNodes: !36) | |
| !32 = !DISubroutineType(types: !33) | |
| !33 = !{null, !34, !35, !34} | |
| !34 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !4, size: 32) | |
| !35 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) | |
| !36 = !{!37, !38, !39, !40} | |
| !37 = !DILocalVariable(name: "filename", arg: 1, scope: !31, file: !2, line: 24, type: !34) | |
| !38 = !DILocalVariable(name: "line", arg: 2, scope: !31, file: !2, line: 24, type: !35) | |
| !39 = !DILocalVariable(name: "message", arg: 3, scope: !31, file: !2, line: 24, type: !34) | |
| !40 = !DILocalVariable(name: "status", scope: !31, file: !2, line: 26, type: !35) | |
| !41 = !DILocation(line: 0, scope: !31) | |
| !42 = !DILocation(line: 28, column: 7, scope: !43) | |
| !43 = distinct !DILexicalBlock(scope: !31, file: !2, line: 28, column: 7) | |
| !44 = !{!45, !45, i64 0} | |
| !45 = !{!"any pointer", !46, i64 0} | |
| !46 = !{!"omnipotent char", !47, i64 0} | |
| !47 = !{!"Simple C/C++ TBAA"} | |
| !48 = !DILocation(line: 28, column: 19, scope: !43) | |
| !49 = !DILocation(line: 28, column: 7, scope: !31) | |
| !50 = !DILocation(line: 32, column: 14, scope: !43) | |
| !51 = !DILocation(line: 35, column: 14, scope: !52) | |
| !52 = distinct !DILexicalBlock(scope: !31, file: !2, line: 35, column: 7) | |
| !53 = !DILocation(line: 35, column: 7, scope: !31) | |
| !54 = !DILocation(line: 38, column: 3, scope: !31) | |
| !55 = !DISubprogram(name: "fprintf", scope: !56, file: !56, line: 129, type: !57, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !103) | |
| !56 = !DIFile(filename: "stdio.h", directory: "/test") | |
| !57 = !DISubroutineType(types: !58) | |
| !58 = !{!35, !59, !101, null} | |
| !59 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !60, size: 32) | |
| !60 = !DIDerivedType(tag: DW_TAG_typedef, name: "FILE", file: !56, line: 107, baseType: !61) | |
| !61 = !DIDerivedType(tag: DW_TAG_typedef, name: "_Filet", file: !56, line: 104, baseType: !62) | |
| !62 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "_Dnk_filet", file: !56, line: 85, size: 640, elements: !63) | |
| !63 = !{!64, !66, !68, !69, !71, !72, !73, !74, !75, !76, !80, !84, !85, !86, !87, !95, !96, !100} | |
| !64 = !DIDerivedType(tag: DW_TAG_member, name: "_Mode", scope: !62, file: !56, line: 87, baseType: !65, size: 16) | |
| !65 = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned) | |
| !66 = !DIDerivedType(tag: DW_TAG_member, name: "_Idx", scope: !62, file: !56, line: 88, baseType: !67, size: 8, offset: 16) | |
| !67 = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char) | |
| !68 = !DIDerivedType(tag: DW_TAG_member, name: "_Handle", scope: !62, file: !56, line: 89, baseType: !35, size: 32, offset: 32) | |
| !69 = !DIDerivedType(tag: DW_TAG_member, name: "_Buf", scope: !62, file: !56, line: 91, baseType: !70, size: 32, offset: 64) | |
| !70 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !67, size: 32) | |
| !71 = !DIDerivedType(tag: DW_TAG_member, name: "_Bend", scope: !62, file: !56, line: 91, baseType: !70, size: 32, offset: 96) | |
| !72 = !DIDerivedType(tag: DW_TAG_member, name: "_Next", scope: !62, file: !56, line: 91, baseType: !70, size: 32, offset: 128) | |
| !73 = !DIDerivedType(tag: DW_TAG_member, name: "_Rend", scope: !62, file: !56, line: 92, baseType: !70, size: 32, offset: 160) | |
| !74 = !DIDerivedType(tag: DW_TAG_member, name: "_Wend", scope: !62, file: !56, line: 92, baseType: !70, size: 32, offset: 192) | |
| !75 = !DIDerivedType(tag: DW_TAG_member, name: "_Rback", scope: !62, file: !56, line: 92, baseType: !70, size: 32, offset: 224) | |
| !76 = !DIDerivedType(tag: DW_TAG_member, name: "_WRback", scope: !62, file: !56, line: 94, baseType: !77, size: 32, offset: 256) | |
| !77 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !78, size: 32) | |
| !78 = !DIDerivedType(tag: DW_TAG_typedef, name: "_Wchart", file: !79, line: 851, baseType: !35) | |
| !79 = !DIFile(filename: "yvals.h", directory: "/test") | |
| !80 = !DIDerivedType(tag: DW_TAG_member, name: "_WBack", scope: !62, file: !56, line: 94, baseType: !81, size: 64, offset: 288) | |
| !81 = !DICompositeType(tag: DW_TAG_array_type, baseType: !78, size: 64, elements: !82) | |
| !82 = !{!83} | |
| !83 = !DISubrange(count: 2) | |
| !84 = !DIDerivedType(tag: DW_TAG_member, name: "_Rsave", scope: !62, file: !56, line: 95, baseType: !70, size: 32, offset: 352) | |
| !85 = !DIDerivedType(tag: DW_TAG_member, name: "_WRend", scope: !62, file: !56, line: 95, baseType: !70, size: 32, offset: 384) | |
| !86 = !DIDerivedType(tag: DW_TAG_member, name: "_WWend", scope: !62, file: !56, line: 95, baseType: !70, size: 32, offset: 416) | |
| !87 = !DIDerivedType(tag: DW_TAG_member, name: "_Wstate", scope: !62, file: !56, line: 97, baseType: !88, size: 64, offset: 448) | |
| !88 = !DIDerivedType(tag: DW_TAG_typedef, name: "_Mbstatet", file: !56, line: 64, baseType: !89) | |
| !89 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "_Mbstatet", file: !56, line: 60, size: 64, elements: !90) | |
| !90 = !{!91, !93, !94} | |
| !91 = !DIDerivedType(tag: DW_TAG_member, name: "_Wchar", scope: !89, file: !56, line: 62, baseType: !92, size: 32) | |
| !92 = !DIBasicType(name: "unsigned long", size: 32, encoding: DW_ATE_unsigned) | |
| !93 = !DIDerivedType(tag: DW_TAG_member, name: "_Byte", scope: !89, file: !56, line: 63, baseType: !65, size: 16, offset: 32) | |
| !94 = !DIDerivedType(tag: DW_TAG_member, name: "_State", scope: !89, file: !56, line: 63, baseType: !65, size: 16, offset: 48) | |
| !95 = !DIDerivedType(tag: DW_TAG_member, name: "_Tmpnam", scope: !62, file: !56, line: 98, baseType: !34, size: 32, offset: 512) | |
| !96 = !DIDerivedType(tag: DW_TAG_member, name: "_Back", scope: !62, file: !56, line: 99, baseType: !97, size: 64, offset: 544) | |
| !97 = !DICompositeType(tag: DW_TAG_array_type, baseType: !67, size: 64, elements: !98) | |
| !98 = !{!99} | |
| !99 = !DISubrange(count: 8) | |
| !100 = !DIDerivedType(tag: DW_TAG_member, name: "_Cbuf", scope: !62, file: !56, line: 99, baseType: !67, size: 8, offset: 608) | |
| !101 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !102, size: 32) | |
| !102 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !4) | |
| !103 = !{} | |
| !104 = !DISubprogram(name: "exit", scope: !105, file: !105, line: 82, type: !106, flags: DIFlagPrototyped | DIFlagNoReturn, spFlags: DISPFlagOptimized, retainedNodes: !103) | |
| !105 = !DIFile(filename: "stdlib.h", directory: "/test") | |
| !106 = !DISubroutineType(types: !107) | |
| !107 = !{null, !35} | |
| ... | |
| --- | |
| name: fatal_error_message | |
| alignment: 16 | |
| exposesReturnsTwice: false | |
| legalized: false | |
| regBankSelected: false | |
| selected: false | |
| failedISel: false | |
| tracksRegLiveness: true | |
| hasWinCFI: false | |
| callsEHReturn: false | |
| callsUnwindInit: false | |
| hasEHContTarget: false | |
| hasEHScopes: false | |
| hasEHFunclets: false | |
| isOutlined: false | |
| debugInstrRef: false | |
| failsVerification: true | |
| tracksDebugUserValues: true | |
| registers: [] | |
| liveins: | |
| - { reg: '$r0', virtual-reg: '' } | |
| - { reg: '$r1', virtual-reg: '' } | |
| - { reg: '$r2', virtual-reg: '' } | |
| frameInfo: | |
| isFrameAddressTaken: false | |
| isReturnAddressTaken: false | |
| hasStackMap: false | |
| hasPatchPoint: false | |
| stackSize: 16 | |
| offsetAdjustment: 0 | |
| maxAlignment: 4 | |
| adjustsStack: true | |
| hasCalls: true | |
| stackProtector: '' | |
| functionContext: '' | |
| maxCallFrameSize: 16 | |
| cvBytesOfCalleeSavedRegisters: 0 | |
| hasOpaqueSPAdjustment: false | |
| hasVAStart: false | |
| hasMustTailInVarArgFunc: false | |
| hasTailCall: false | |
| localFrameSize: 0 | |
| savePoint: [] | |
| restorePoint: [] | |
| fixedStack: [] | |
| stack: [] | |
| callSites: [] | |
| debugValueSubstitutions: [] | |
| constants: [] | |
| machineFunctionInfo: {} | |
| body: | | |
| bb.0.entry: | |
| successors: %bb.1(0x40000000), %bb.2(0x40000000) | |
| liveins: $r0, $r1, $r2 | |
| DBG_VALUE $r0, $noreg, !37, !DIExpression(), debug-location !41 | |
| DBG_VALUE $r1, $noreg, !38, !DIExpression(), debug-location !41 | |
| DBG_VALUE $r2, $noreg, !39, !DIExpression(), debug-location !41 | |
| BUNDLE implicit-def $r3, implicit-def $r29, implicit-def $r30, implicit killed $gp, implicit killed $r29, implicit killed $framekey, implicit killed $framelimit, implicit $r30, implicit killed $r31, debug-location !42 { | |
| renamable $r3 = L2_loadrigp @datafileptr, implicit killed $gp, debug-location !42 :: (dereferenceable load (s32) from @datafileptr, !tbaa !44) | |
| $r29 = frame-setup S2_allocframe killed $r29, 16, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit $r30, implicit killed $r31, debug-location !42 :: (store (s32) into stack) | |
| } | |
| DBG_VALUE 0, $noreg, !40, !DIExpression(), debug-location !41 | |
| DBG_VALUE $r0, $noreg, !37, !DIExpression(), debug-location !41 | |
| BUNDLE implicit-def dead $p0, implicit-def $pc, implicit $r3, debug-location !48 { | |
| renamable $p0 = C2_cmpeqi renamable $r3, 0, debug-location !48 | |
| J2_jumpfnewpt internal killed renamable $p0, %bb.2, implicit-def $pc, debug-location !49 | |
| } | |
| bb.1: | |
| successors: %bb.4(0x80000000) | |
| BUNDLE implicit-def $r1, implicit-def $r2, implicit-def $pc { | |
| renamable $r1 = A2_tfrsi @.str | |
| renamable $r2 = A2_tfrsi 30 | |
| J2_jump %bb.4, implicit-def $pc | |
| } | |
| bb.2.if.end: | |
| successors: %bb.3(0x40000000), %bb.5(0x40000000) | |
| liveins: $r0, $r1, $r2, $r3 | |
| DBG_VALUE $r4, $noreg, !37, !DIExpression(), debug-location !41 | |
| BUNDLE implicit-def $r4, implicit-def $d0, implicit-def $r0, implicit-def $r1, implicit killed $r0, implicit $r29, implicit killed $r1, implicit killed $r3, debug-location !41 { | |
| $r4 = A2_tfr killed $r0 | |
| S2_storeri_io $r29, 8, killed renamable $r1, debug-location !50 :: (store (s32) into stack + 8) | |
| $d0 = A4_combineir @.str.2, killed $r3, debug-location !50 | |
| } | |
| BUNDLE implicit $r29, implicit killed $r2, implicit killed $r4, debug-location !50 { | |
| S2_storeri_io $r29, 12, killed renamable $r2, debug-location !50 :: (store (s32) into stack + 12) | |
| S2_storeri_io $r29, 4, killed renamable $r4, debug-location !50 :: (store (s32) into stack + 4) | |
| } | |
| DBG_VALUE $r0, $noreg, !40, !DIExpression(), debug-location !41 | |
| BUNDLE implicit-def $pc, implicit-def $r31, implicit-def $r29, implicit-def $r0, implicit $r29, implicit $r0, implicit $r1, debug-location !50 { | |
| S4_storeiri_io $r29, 0, @.str.3, debug-location !50 :: (store (s32) into stack) | |
| J2_call @fprintf, hexagoncsr, implicit-def $pc, implicit-def $r31, implicit $r29, implicit $r0, implicit $r1, implicit-def $r29, implicit-def $r0, debug-location !50 | |
| } | |
| BUNDLE implicit-def dead $p0, implicit-def $pc, implicit killed $r0, debug-location !51 { | |
| renamable $p0 = C2_cmpeqi killed renamable $r0, -1, debug-location !51 | |
| J2_jumpfnewpt internal killed renamable $p0, %bb.5, implicit-def $pc, debug-location !53 | |
| } | |
| bb.3: | |
| successors: %bb.4(0x80000000) | |
| BUNDLE implicit-def $r1, implicit-def $r2 { | |
| renamable $r1 = A2_tfrsi @.str.4 | |
| renamable $r2 = A2_tfrsi 37 | |
| } | |
| bb.4.if.end5.sink.split: | |
| successors: %bb.5(0x80000000) | |
| liveins: $r1, $r2 | |
| BUNDLE implicit-def $r0, implicit $r29, implicit killed $r2, debug-location !41 { | |
| $r0 = A2_tfrsi @_Stderr, debug-location !41 | |
| S2_storeri_io $r29, 4, killed renamable $r2, debug-location !41 :: (store (s32) into stack + 4) | |
| } | |
| BUNDLE implicit-def $pc, implicit-def $r31, implicit-def $r29, implicit-def $r0, implicit $r29, implicit $r0, implicit $r1, debug-location !41 { | |
| S4_storeiri_io $r29, 0, @.str.1, debug-location !41 :: (store (s32) into stack) | |
| J2_call @fprintf, hexagoncsr, implicit-def $pc, implicit-def $r31, implicit $r29, implicit $r0, implicit $r1, implicit-def $r29, implicit-def $r0, debug-location !41 | |
| } | |
| bb.5.if.end5: | |
| BUNDLE implicit-def $r0, implicit-def $r29, debug-location !54 { | |
| $r0 = A2_tfrsi 1, debug-location !54 | |
| PS_call_nr @exit, hexagoncsr, implicit internal $r0, implicit-def $r29, debug-location !54 | |
| } | |
| ... |