Andrew Kelley via llvm-dev
2017-Sep-16 17:48 UTC
[llvm-dev] assertion triggered since update to llvm 5
When zig updated to llvm 5 we started hitting this assertion: zig: /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:106: static bool llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To = llvm::Instruction; From = llvm::Value]: Assertion `Val && "isa<> used on a null pointer"' failed. I wonder if however this was caused by an invalid assertion, because up the stack is #8 0x0000000004b58e68 in (anonymous namespace)::NewGVN::InstrToDFSNum (this=0x7fffffffaf80, V=0x0) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:735 735 assert(isa<Instruction>(V) && "This should not be used for MemoryAccesses"); With assertions off the code works fine. Can anyone provide some guidance? Here is a full backtrace: zig: /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:106: static bool llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To = llvm::Instruction; From = llvm::Value]: Assertion `Val && "isa<> used on a null pointer"' failed. Program received signal SIGABRT, Aborted. 0x00007ffff698f3d4 in raise () from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/libc.so.6 (gdb) bt #0 0x00007ffff698f3d4 in raise () from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/libc.so.6 #1 0x00007ffff699083a in abort () from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/libc.so.6 #2 0x00007ffff69881a7 in __assert_fail_base () from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/libc.so.6 #3 0x00007ffff6988252 in __assert_fail () from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/libc.so.6 #4 0x0000000002d70389 in llvm::isa_impl_cl<llvm::Instruction, llvm::Value const*>::doit ( Val=0x0) at /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:106 #5 0x0000000002d4f8af in llvm::isa_impl_wrap<llvm::Instruction, llvm::Value const*, llvm::Value const*>::doit (Val=@0x7fffffffa678: 0x0) at /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:133 #6 0x0000000002ece9a3 in llvm::isa_impl_wrap<llvm::Instruction, llvm::Value const* const, llvm::Value const*>::doit (Val=@0x7fffffffa6b0: 0x0) at /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:125 #7 0x0000000002ecd4f4 in llvm::isa<llvm::Instruction, llvm::Value const*> ( Val=@0x7fffffffa6b0: 0x0) at /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:144 #8 0x0000000004b58e68 in (anonymous namespace)::NewGVN::InstrToDFSNum (this=0x7fffffffaf80, V=0x0) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:735 #9 0x0000000004b6870d in (anonymous namespace)::NewGVN::touchAndErase<llvm::DenseMap<llvm::Value const*, llvm::SmallPtrSet<llvm::Value*, 2u> >, llvm::Value*> (this=0x7fffffffaf80, M=..., Key=@0x7fffffffa790: 0x9154cf8) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:1930 #10 0x0000000004b5d9b7 in (anonymous namespace)::NewGVN::markUsersTouched (this=0x7fffffffaf80, V=0x9154cf8) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:1946 #11 0x0000000004b5f141 in (anonymous namespace)::NewGVN::performCongruenceFinding ( this=0x7fffffffaf80, I=0x9154cf8, E=0x91d7b70) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:2269 #12 0x0000000004b62174 in (anonymous namespace)::NewGVN::valueNumberInstruction ( this=0x7fffffffaf80, I=0x9154cf8) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:2801 #13 0x0000000004b63b4f in (anonymous namespace)::NewGVN::iterateTouchedInstructions ( this=0x7fffffffaf80) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:3094 #14 0x0000000004b6431c in (anonymous namespace)::NewGVN::runGVN (this=0x7fffffffaf80) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:3165 #15 0x0000000004b678db in (anonymous namespace)::NewGVNLegacyPass::runOnFunction ( this=0x910ea50, F=...) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp:3904 #16 0x00000000054d10fd in llvm::FPPassManager::runOnFunction (this=0x9102260, F=...) at /home/andy/downloads/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1514 #17 0x0000000004f2a375 in (anonymous namespace)::CGPassManager::RunPassOnSCC (this=0x9100f00, P=0x9102260, CurSCC=..., CG=..., CallGraphUpToDate=@0x7fffffffbc2f: true, DevirtualizedCall=@0x7fffffffbccf: false) at /home/andy/downloads/llvm-project/llvm/lib/Analysis/CallGraphSCCPass.cpp:149 #18 0x0000000004f2b349 in (anonymous namespace)::CGPassManager::RunAllPassesOnSCC ( this=0x9100f00, CurSCC=..., CG=..., DevirtualizedCall=@0x7fffffffbccf: false) at /home/andy/downloads/llvm-project/llvm/lib/Analysis/CallGraphSCCPass.cpp:419 #19 0x0000000004f2b643 in (anonymous namespace)::CGPassManager::runOnModule (this=0x9100f00, M=...) at /home/andy/downloads/llvm-project/llvm/lib/Analysis/CallGraphSCCPass.cpp:474 #20 0x00000000054d15c1 in (anonymous namespace)::MPPassManager::runOnModule (this=0x90f9970, ---Type <return> to continue, or q <return> to quit--- M=...) at /home/andy/downloads/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1591 #21 0x00000000054d1c73 in llvm::legacy::PassManagerImpl::run (this=0x90f9480, M=...) at /home/andy/downloads/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1694 #22 0x00000000054d1e7f in llvm::legacy::PassManager::run (this=0x7fffffffc010, M=...) at /home/andy/downloads/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1725 #23 0x0000000001d4017d in ZigLLVMTargetMachineEmitToFile (targ_machine_ref=0x9080d50, module_ref=0x907e870, filename=0x90cf360 "./zig-cache/test.o", file_type=LLVMObjectFile, error_message=0x7fffffffc2f8, is_debug=false) at /home/andy/dev/zig/src/zig_llvm.cpp:166 #24 0x0000000001cd041d in do_code_gen (g=0x907a980) at /home/andy/dev/zig/src/codegen.cpp:4379 #25 0x0000000001cd4634 in codegen_build (g=0x907a980) at /home/andy/dev/zig/src/codegen.cpp:5484 #26 0x0000000001d1d564 in main (argc=4, argv=0x7fffffffca18) at /home/andy/dev/zig/src/main.cpp:666 Here's the smallest zig test case to cause the problem: export fn entry() { var bytes: []const u8 = "format"; write(bytes); } pub fn write(bytes: []const u8) { var index: usize = 0; var src_index: usize = 0; while (src_index < bytes.len) { const dest_space_left = 1 - index; const b = bytes.len - src_index; const copy_amt = if (dest_space_left < b) dest_space_left else b; index += copy_amt; src_index += copy_amt; } } pub fn panic(msg: []const u8) -> noreturn { while (true) {} } compile with ./zig build_obj test.zig --release-safe This does the equivalent of -O3 The IR that it produces; ModuleID = 'test' source_filename = "test" target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" %"[]u8" = type { i8*, i64 } @__zig_panic_implementation_provided = internal unnamed_addr constant i1 true, align 1 @0 = internal unnamed_addr constant i8* getelementptr inbounds ([6 x i8], [6 x i8]* @1, i64 0, i64 0), align 8 @1 = internal unnamed_addr constant [6 x i8] c"format", align 1 @2 = internal unnamed_addr constant { i8*, i64 } { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @1, i64 0, i64 0), i64 6 }, align 8 @3 = internal unnamed_addr constant i8* getelementptr inbounds ([16 x i8], [16 x i8]* @4, i64 0, i64 0), align 8 @4 = internal unnamed_addr constant [16 x i8] c"integer overflow", align 1 @5 = internal unnamed_addr constant { i8*, i64 } { i8* getelementptr inbounds ([16 x i8], [16 x i8]* @4, i64 0, i64 0), i64 16 }, align 8 ; Function Attrs: nobuiltin nounwind define void @entry() #0 !dbg !16 { Entry: %bytes = alloca %"[]u8", align 8 %0 = bitcast %"[]u8"* %bytes to i8*, !dbg !31 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ({ i8*, i64 }* @2 to i8*), i64 16, i32 8, i1 false), !dbg !31 call void @llvm.dbg.declare(metadata %"[]u8"* %bytes, metadata !22, metadata !32), !dbg !31 call fastcc void @write(%"[]u8"* byval %bytes), !dbg !33 ret void, !dbg !35 } ; Function Attrs: cold nobuiltin noreturn nounwind define linkonce coldcc void @__zig_panic(i8* nonnull readonly, i64) #1 !dbg !36 { Entry: %2 = alloca %"[]u8", align 8 %message_ptr = alloca i8*, align 8 %message_len = alloca i64, align 8 store i8* %0, i8** %message_ptr, align 8 call void @llvm.dbg.declare(metadata i8** %message_ptr, metadata !41, metadata !32), !dbg !44 store i64 %1, i64* %message_len, align 8 call void @llvm.dbg.declare(metadata i64* %message_len, metadata !42, metadata !32), !dbg !45 %3 = load i64, i64* %message_len, align 8, !dbg !46 %4 = load i8*, i8** %message_ptr, align 8, !dbg !50 %5 = getelementptr inbounds %"[]u8", %"[]u8"* %2, i32 0, i32 0, !dbg !50 %6 = getelementptr inbounds i8, i8* %4, i64 0, !dbg !50 store i8* %6, i8** %5, align 8, !dbg !50 %7 = getelementptr inbounds %"[]u8", %"[]u8"* %2, i32 0, i32 1, !dbg !50 %8 = sub nsw i64 %3, 0, !dbg !50 store i64 %8, i64* %7, align 8, !dbg !50 call fastcc void @panic(%"[]u8"* byval %2), !dbg !51 unreachable, !dbg !51 } ; Function Attrs: nobuiltin nounwind define internal fastcc void @write(%"[]u8"* byval nonnull readonly) unnamed_addr #0 !dbg !52 { Entry: %index = alloca i64, align 8 %src_index = alloca i64, align 8 %dest_space_left = alloca i64, align 8 %b = alloca i64, align 8 %copy_amt = alloca i64, align 8 call void @llvm.dbg.declare(metadata %"[]u8"* %0, metadata !57, metadata !32), !dbg !70 store i64 0, i64* %index, align 8, !dbg !71 call void @llvm.dbg.declare(metadata i64* %index, metadata !58, metadata !32), !dbg !71 store i64 0, i64* %src_index, align 8, !dbg !72 call void @llvm.dbg.declare(metadata i64* %src_index, metadata !61, metadata !32), !dbg !72 br label %WhileCond, !dbg !73 WhileCond: ; preds = %OverflowOk6, %Entry %1 = load i64, i64* %src_index, align 8, !dbg !74 %2 = getelementptr inbounds %"[]u8", %"[]u8"* %0, i32 0, i32 1, !dbg !75 %3 = load i64, i64* %2, align 8, !dbg !75 %4 = icmp ult i64 %1, %3, !dbg !76 br i1 %4, label %WhileBody, label %WhileEnd, !dbg !76 WhileBody: ; preds = %WhileCond %5 = load i64, i64* %index, align 8, !dbg !77 %6 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 1, i64 %5), !dbg !78 %7 = extractvalue { i64, i1 } %6, 0, !dbg !78 %8 = extractvalue { i64, i1 } %6, 1, !dbg !78 br i1 %8, label %OverflowFail, label %OverflowOk, !dbg !78 WhileEnd: ; preds = %WhileCond ret void, !dbg !79 Then: ; preds = %OverflowOk2 %9 = load i64, i64* %dest_space_left, align 8, !dbg !80 br label %EndIf, !dbg !81 Else: ; preds = %OverflowOk2 %10 = load i64, i64* %b, align 8, !dbg !82 br label %EndIf, !dbg !81 EndIf: ; preds = %Else, %Then %11 = phi i64 [ %9, %Then ], [ %10, %Else ], !dbg !81 store i64 %11, i64* %copy_amt, align 8, !dbg !83 call void @llvm.dbg.declare(metadata i64* %copy_amt, metadata !68, metadata !32), !dbg !83 %12 = load i64, i64* %index, align 8, !dbg !84 %13 = load i64, i64* %copy_amt, align 8, !dbg !86 %14 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %12, i64 %13), !dbg !87 %15 = extractvalue { i64, i1 } %14, 0, !dbg !87 %16 = extractvalue { i64, i1 } %14, 1, !dbg !87 br i1 %16, label %OverflowFail3, label %OverflowOk4, !dbg !87 OverflowFail: ; preds = %WhileBody %17 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* @5, i32 0, i32 0), align 8, !dbg !78 %18 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* @5, i32 0, i32 1), align 8, !dbg !78 call coldcc void @__zig_panic(i8* %17, i64 %18), !dbg !78 unreachable, !dbg !78 OverflowOk: ; preds = %WhileBody store i64 %7, i64* %dest_space_left, align 8, !dbg !88 call void @llvm.dbg.declare(metadata i64* %dest_space_left, metadata !63, metadata !32), !dbg !88 %19 = getelementptr inbounds %"[]u8", %"[]u8"* %0, i32 0, i32 1, !dbg !89 %20 = load i64, i64* %19, align 8, !dbg !89 %21 = load i64, i64* %src_index, align 8, !dbg !90 %22 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %20, i64 %21), !dbg !91 %23 = extractvalue { i64, i1 } %22, 0, !dbg !91 %24 = extractvalue { i64, i1 } %22, 1, !dbg !91 br i1 %24, label %OverflowFail1, label %OverflowOk2, !dbg !91 OverflowFail1: ; preds = %OverflowOk %25 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* @5, i32 0, i32 0), align 8, !dbg !91 %26 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* @5, i32 0, i32 1), align 8, !dbg !91 call coldcc void @__zig_panic(i8* %25, i64 %26), !dbg !91 unreachable, !dbg !91 OverflowOk2: ; preds = %OverflowOk store i64 %23, i64* %b, align 8, !dbg !92 call void @llvm.dbg.declare(metadata i64* %b, metadata !66, metadata !32), !dbg !92 %27 = load i64, i64* %dest_space_left, align 8, !dbg !93 %28 = load i64, i64* %b, align 8, !dbg !94 %29 = icmp ult i64 %27, %28, !dbg !95 br i1 %29, label %Then, label %Else, !dbg !95 OverflowFail3: ; preds = %EndIf %30 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* @5, i32 0, i32 0), align 8, !dbg !87 %31 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* @5, i32 0, i32 1), align 8, !dbg !87 call coldcc void @__zig_panic(i8* %30, i64 %31), !dbg !87 unreachable, !dbg !87 OverflowOk4: ; preds = %EndIf store i64 %15, i64* %index, align 8, !dbg !87 %32 = load i64, i64* %src_index, align 8, !dbg !96 %33 = load i64, i64* %copy_amt, align 8, !dbg !97 %34 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %32, i64 %33), !dbg !98 %35 = extractvalue { i64, i1 } %34, 0, !dbg !98 %36 = extractvalue { i64, i1 } %34, 1, !dbg !98 br i1 %36, label %OverflowFail5, label %OverflowOk6, !dbg !98 OverflowFail5: ; preds = %OverflowOk4 %37 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* @5, i32 0, i32 0), align 8, !dbg !98 %38 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* @5, i32 0, i32 1), align 8, !dbg !98 call coldcc void @__zig_panic(i8* %37, i64 %38), !dbg !98 unreachable, !dbg !98 OverflowOk6: ; preds = %OverflowOk4 store i64 %35, i64* %src_index, align 8, !dbg !98 br label %WhileCond, !dbg !73 } ; Function Attrs: nobuiltin noreturn nounwind define internal fastcc void @panic(%"[]u8"* byval nonnull readonly) unnamed_addr #2 !dbg !99 { Entry: call void @llvm.dbg.declare(metadata %"[]u8"* %0, metadata !101, metadata !32), !dbg !102 br label %WhileCond, !dbg !103 WhileCond: ; preds = %WhileCond, %Entry br label %WhileCond, !dbg !103 } ; Function Attrs: argmemonly nounwind declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) #3 ; Function Attrs: nounwind readnone speculatable declare void @llvm.dbg.declare(metadata, metadata, metadata) #4 ; Function Attrs: nounwind readnone speculatable declare { i64, i1 } @llvm.usub.with.overflow.i64(i64, i64) #4 ; Function Attrs: nounwind readnone speculatable declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) #4 attributes #0 = { nobuiltin nounwind } attributes #1 = { cold nobuiltin noreturn nounwind } attributes #2 = { nobuiltin noreturn nounwind } attributes #3 = { argmemonly nounwind } attributes #4 = { nounwind readnone speculatable } !llvm.module.flags = !{!0} !llvm.dbg.cu = !{!1} !0 = !{i32 2, !"Debug Info Version", i32 3} !1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, producer: "zig 0.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !3, globals: !12) !2 = !DIFile(filename: "test", directory: ".") !3 = !{!4} !4 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "GlobalLinkage", scope: !5, file: !5, line: 138, baseType: !6, size: 8, align: 8, elements: !7) !5 = !DIFile(filename: "builtin.zig", directory: "/home/andy/dev/zig/build-llvm5-debug/zig-cache") !6 = !DIBasicType(name: "u3", size: 8, encoding: DW_ATE_unsigned) !7 = !{!8, !9, !10, !11} !8 = !DIEnumerator(name: "Internal", value: 0) !9 = !DIEnumerator(name: "Strong", value: 1) !10 = !DIEnumerator(name: "Weak", value: 2) !11 = !DIEnumerator(name: "LinkOnce", value: 3) !12 = !{!13} !13 = !DIGlobalVariableExpression(var: !14) !14 = distinct !DIGlobalVariable(name: "__zig_panic_implementation_provided", linkageName: "__zig_panic_implementation_provided", scope: !5, file: !5, line: 201, type: !15, isLocal: true, isDefinition: true) !15 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean) !16 = distinct !DISubprogram(name: "entry", scope: !17, file: !17, type: !18, isLocal: false, isDefinition: true, isOptimized: true, unit: !1, variables: !21) !17 = !DIFile(filename: "test.zig", directory: "/home/andy/dev/zig/build-llvm5-debug") !18 = !DISubroutineType(types: !19) !19 = !{!20} !20 = !DIBasicType(name: "void", encoding: DW_ATE_unsigned) !21 = !{!22} !22 = !DILocalVariable(name: "bytes", scope: !23, file: !17, line: 2, type: !24) !23 = distinct !DILexicalBlock(scope: !16, file: !17, line: 1, column: 19) !24 = !DICompositeType(tag: DW_TAG_structure_type, name: "[]u8", size: 128, align: 64, elements: !25) !25 = !{!26, !29} !26 = !DIDerivedType(tag: DW_TAG_member, name: "ptr", scope: !24, baseType: !27, size: 64, align: 64) !27 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "&u8", baseType: !28, size: 64, align: 64) !28 = !DIBasicType(name: "u8", size: 8, encoding: DW_ATE_unsigned_char) !29 = !DIDerivedType(tag: DW_TAG_member, name: "len", scope: !24, baseType: !30, size: 64, align: 64, offset: 64) !30 = !DIBasicType(name: "usize", size: 64, encoding: DW_ATE_unsigned) !31 = !DILocation(line: 2, column: 5, scope: !23) !32 = !DIExpression() !33 = !DILocation(line: 3, column: 10, scope: !34) !34 = distinct !DILexicalBlock(scope: !23, file: !17, line: 2, column: 5) !35 = !DILocation(line: 1, column: 19, scope: !16) !36 = distinct !DISubprogram(name: "__zig_panic", scope: !37, file: !37, line: 7, type: !38, isLocal: false, isDefinition: true, scopeLine: 7, isOptimized: true, unit: !1, variables: !40) !37 = !DIFile(filename: "zigrt.zig", directory: "/home/andy/dev/zig/build-llvm5-debug/lib/zig/std/special") !38 = !DISubroutineType(types: !39) !39 = !{!20, !27, !30} !40 = !{!41, !42} !41 = !DILocalVariable(name: "message_ptr", arg: 1, scope: !36, file: !37, line: 7, type: !27) !42 = !DILocalVariable(name: "message_len", arg: 2, scope: !43, file: !37, line: 7, type: !30) !43 = distinct !DILexicalBlock(scope: !36, file: !37, line: 7, column: 30) !44 = !DILocation(line: 7, column: 30, scope: !36) !45 = !DILocation(line: 7, column: 54, scope: !43) !46 = !DILocation(line: 12, column: 48, scope: !47) !47 = distinct !DILexicalBlock(scope: !48, file: !37, line: 11, column: 54) !48 = distinct !DILexicalBlock(scope: !49, file: !37, line: 7, column: 86) !49 = distinct !DILexicalBlock(scope: !43, file: !37, line: 7, column: 54) !50 = !DILocation(line: 12, column: 43, scope: !47) !51 = !DILocation(line: 12, column: 31, scope: !47) !52 = distinct !DISubprogram(name: "write", scope: !17, file: !17, line: 6, type: !53, isLocal: true, isDefinition: true, scopeLine: 6, isOptimized: true, unit: !1, variables: !56) !53 = !DISubroutineType(types: !54) !54 = !{!20, !55} !55 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "&[]const u8", baseType: !24, size: 64, align: 64) !56 = !{!57, !58, !61, !63, !66, !68} !57 = !DILocalVariable(name: "bytes", arg: 1, scope: !52, file: !17, line: 6, type: !24) !58 = !DILocalVariable(name: "index", scope: !59, file: !17, line: 7, type: !30) !59 = distinct !DILexicalBlock(scope: !60, file: !17, line: 6, column: 33) !60 = distinct !DILexicalBlock(scope: !52, file: !17, line: 6, column: 14) !61 = !DILocalVariable(name: "src_index", scope: !62, file: !17, line: 9, type: !30) !62 = distinct !DILexicalBlock(scope: !59, file: !17, line: 7, column: 5) !63 = !DILocalVariable(name: "dest_space_left", scope: !64, file: !17, line: 12, type: !30) !64 = distinct !DILexicalBlock(scope: !65, file: !17, line: 11, column: 35) !65 = distinct !DILexicalBlock(scope: !62, file: !17, line: 9, column: 5) !66 = !DILocalVariable(name: "b", scope: !67, file: !17, line: 13, type: !30) !67 = distinct !DILexicalBlock(scope: !64, file: !17, line: 12, column: 9) !68 = !DILocalVariable(name: "copy_amt", scope: !69, file: !17, line: 14, type: !30) !69 = distinct !DILexicalBlock(scope: !67, file: !17, line: 13, column: 9) !70 = !DILocation(line: 6, column: 14, scope: !52) !71 = !DILocation(line: 7, column: 5, scope: !59) !72 = !DILocation(line: 9, column: 5, scope: !62) !73 = !DILocation(line: 11, column: 5, scope: !65) !74 = !DILocation(line: 11, column: 12, scope: !65) !75 = !DILocation(line: 11, column: 29, scope: !65) !76 = !DILocation(line: 11, column: 22, scope: !65) !77 = !DILocation(line: 12, column: 37, scope: !64) !78 = !DILocation(line: 12, column: 35, scope: !64) !79 = !DILocation(line: 11, column: 5, scope: !60) !80 = !DILocation(line: 14, column: 51, scope: !69) !81 = !DILocation(line: 14, column: 26, scope: !69) !82 = !DILocation(line: 14, column: 72, scope: !69) !83 = !DILocation(line: 14, column: 9, scope: !69) !84 = !DILocation(line: 15, column: 9, scope: !85) !85 = distinct !DILexicalBlock(scope: !69, file: !17, line: 14, column: 9) !86 = !DILocation(line: 15, column: 18, scope: !85) !87 = !DILocation(line: 15, column: 15, scope: !85) !88 = !DILocation(line: 12, column: 9, scope: !64) !89 = !DILocation(line: 13, column: 24, scope: !67) !90 = !DILocation(line: 13, column: 31, scope: !67) !91 = !DILocation(line: 13, column: 29, scope: !67) !92 = !DILocation(line: 13, column: 9, scope: !67) !93 = !DILocation(line: 14, column: 30, scope: !69) !94 = !DILocation(line: 14, column: 48, scope: !69) !95 = !DILocation(line: 14, column: 46, scope: !69) !96 = !DILocation(line: 16, column: 9, scope: !85) !97 = !DILocation(line: 16, column: 22, scope: !85) !98 = !DILocation(line: 16, column: 19, scope: !85) !99 = distinct !DISubprogram(name: "panic", scope: !17, file: !17, line: 20, type: !53, isLocal: true, isDefinition: true, scopeLine: 20, isOptimized: true, unit: !1, variables: !100) !100 = !{!101} !101 = !DILocalVariable(name: "msg", arg: 1, scope: !99, file: !17, line: 20, type: !24) !102 = !DILocation(line: 20, column: 14, scope: !99) !103 = !DILocation(line: 20, column: 45, scope: !104) !104 = distinct !DILexicalBlock(scope: !105, file: !17, line: 20, column: 43) !105 = distinct !DILexicalBlock(scope: !99, file: !17, line: 20, column: 14) is the following, however clang 5 with assertions on does not hit the assertion when run on this IR: Any pointers would be appreciated. -------------- next part -------------- An HTML attachment was scrubbed... URL: <lists.llvm.org/pipermail/llvm-dev/attachments/20170916/c9e55a64/attachment.html>
Andrew Kelley via llvm-dev
2017-Sep-17 17:45 UTC
[llvm-dev] assertion triggered since update to llvm 5
What do you think about this patch? --- a/llvm/lib/Transforms/Scalar/NewGVN.cpp +++ b/llvm/lib/Transforms/Scalar/NewGVN.cpp @@ -732,7 +732,7 @@ private: MemoryPhi *getMemoryAccess(const BasicBlock *) const; template <class T, class Range> T *getMinDFSOfRange(const Range &) const; unsigned InstrToDFSNum(const Value *V) const { - assert(isa<Instruction>(V) && "This should not be used for MemoryAccesses"); + assert(V == nullptr || (isa<Instruction>(V) && "This should not be used for MemoryAccesses")); return InstrDFS.lookup(V); } On Sat, Sep 16, 2017 at 1:48 PM, Andrew Kelley <superjoe30 at gmail.com> wrote:> When zig updated to llvm 5 we started hitting this assertion: > > zig: /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:106: > static bool llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To > = llvm::Instruction; From = llvm::Value]: Assertion `Val && "isa<> used on > a null pointer"' failed. > > I wonder if however this was caused by an invalid assertion, because up > the stack is > #8 0x0000000004b58e68 in (anonymous namespace)::NewGVN::InstrToDFSNum > (this=0x7fffffffaf80, > V=0x0) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:735 > 735 assert(isa<Instruction>(V) && "This should not be used for > MemoryAccesses"); > > > With assertions off the code works fine. > Can anyone provide some guidance? > > Here is a full backtrace: > > zig: /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:106: > static bool llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To > = llvm::Instruction; From = llvm::Value]: Assertion `Val && "isa<> used on > a null pointer"' failed. > > Program received signal SIGABRT, Aborted. > 0x00007ffff698f3d4 in raise () > from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740a > gg-glibc-2.25/lib/libc.so.6 > (gdb) bt > #0 0x00007ffff698f3d4 in raise () > from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740a > gg-glibc-2.25/lib/libc.so.6 > #1 0x00007ffff699083a in abort () > from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740a > gg-glibc-2.25/lib/libc.so.6 > #2 0x00007ffff69881a7 in __assert_fail_base () > from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740a > gg-glibc-2.25/lib/libc.so.6 > #3 0x00007ffff6988252 in __assert_fail () > from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740a > gg-glibc-2.25/lib/libc.so.6 > #4 0x0000000002d70389 in llvm::isa_impl_cl<llvm::Instruction, > llvm::Value const*>::doit ( > Val=0x0) at /home/andy/downloads/llvm-project/llvm/include/llvm/ > Support/Casting.h:106 > #5 0x0000000002d4f8af in llvm::isa_impl_wrap<llvm::Instruction, > llvm::Value const*, llvm::Value const*>::doit (Val=@0x7fffffffa678: 0x0) > at /home/andy/downloads/llvm-project/llvm/include/llvm/ > Support/Casting.h:133 > #6 0x0000000002ece9a3 in llvm::isa_impl_wrap<llvm::Instruction, > llvm::Value const* const, llvm::Value const*>::doit (Val=@0x7fffffffa6b0: > 0x0) > at /home/andy/downloads/llvm-project/llvm/include/llvm/ > Support/Casting.h:125 > #7 0x0000000002ecd4f4 in llvm::isa<llvm::Instruction, llvm::Value const*> > ( > Val=@0x7fffffffa6b0: 0x0) > at /home/andy/downloads/llvm-project/llvm/include/llvm/ > Support/Casting.h:144 > #8 0x0000000004b58e68 in (anonymous namespace)::NewGVN::InstrToDFSNum > (this=0x7fffffffaf80, > V=0x0) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:735 > #9 0x0000000004b6870d in (anonymous namespace)::NewGVN:: > touchAndErase<llvm::DenseMap<llvm::Value const*, > llvm::SmallPtrSet<llvm::Value*, 2u> >, llvm::Value*> > (this=0x7fffffffaf80, M=..., > Key=@0x7fffffffa790: 0x9154cf8) > at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:1930 > #10 0x0000000004b5d9b7 in (anonymous namespace)::NewGVN::markUsersTouched > (this=0x7fffffffaf80, > V=0x9154cf8) at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:1946 > #11 0x0000000004b5f141 in (anonymous namespace)::NewGVN::performCongruenceFinding > ( > this=0x7fffffffaf80, I=0x9154cf8, E=0x91d7b70) > at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:2269 > #12 0x0000000004b62174 in (anonymous namespace)::NewGVN::valueNumberInstruction > ( > this=0x7fffffffaf80, I=0x9154cf8) > at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:2801 > #13 0x0000000004b63b4f in (anonymous namespace)::NewGVN::iterateTouchedInstructions > ( > this=0x7fffffffaf80) > at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:3094 > #14 0x0000000004b6431c in (anonymous namespace)::NewGVN::runGVN > (this=0x7fffffffaf80) > at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:3165 > #15 0x0000000004b678db in (anonymous namespace)::NewGVNLegacyPass::runOnFunction > ( > this=0x910ea50, F=...) > at /home/andy/downloads/llvm-project/llvm/lib/Transforms/ > Scalar/NewGVN.cpp:3904 > #16 0x00000000054d10fd in llvm::FPPassManager::runOnFunction > (this=0x9102260, F=...) > at /home/andy/downloads/llvm-project/llvm/lib/IR/ > LegacyPassManager.cpp:1514 > #17 0x0000000004f2a375 in (anonymous namespace)::CGPassManager::RunPassOnSCC > (this=0x9100f00, > P=0x9102260, CurSCC=..., CG=..., CallGraphUpToDate=@0x7fffffffbc2f: > true, > DevirtualizedCall=@0x7fffffffbccf: false) > at /home/andy/downloads/llvm-project/llvm/lib/Analysis/ > CallGraphSCCPass.cpp:149 > #18 0x0000000004f2b349 in (anonymous namespace)::CGPassManager::RunAllPassesOnSCC > ( > this=0x9100f00, CurSCC=..., CG=..., DevirtualizedCall=@0x7fffffffbccf: > false) > at /home/andy/downloads/llvm-project/llvm/lib/Analysis/ > CallGraphSCCPass.cpp:419 > #19 0x0000000004f2b643 in (anonymous namespace)::CGPassManager::runOnModule > (this=0x9100f00, > M=...) at /home/andy/downloads/llvm-project/llvm/lib/Analysis/ > CallGraphSCCPass.cpp:474 > #20 0x00000000054d15c1 in (anonymous namespace)::MPPassManager::runOnModule > (this=0x90f9970, > ---Type <return> to continue, or q <return> to quit--- > M=...) at /home/andy/downloads/llvm-project/llvm/lib/IR/ > LegacyPassManager.cpp:1591 > #21 0x00000000054d1c73 in llvm::legacy::PassManagerImpl::run > (this=0x90f9480, M=...) > at /home/andy/downloads/llvm-project/llvm/lib/IR/ > LegacyPassManager.cpp:1694 > #22 0x00000000054d1e7f in llvm::legacy::PassManager::run > (this=0x7fffffffc010, M=...) > at /home/andy/downloads/llvm-project/llvm/lib/IR/ > LegacyPassManager.cpp:1725 > #23 0x0000000001d4017d in ZigLLVMTargetMachineEmitToFile > (targ_machine_ref=0x9080d50, > module_ref=0x907e870, filename=0x90cf360 "./zig-cache/test.o", > file_type=LLVMObjectFile, > error_message=0x7fffffffc2f8, is_debug=false) at > /home/andy/dev/zig/src/zig_llvm.cpp:166 > #24 0x0000000001cd041d in do_code_gen (g=0x907a980) at > /home/andy/dev/zig/src/codegen.cpp:4379 > #25 0x0000000001cd4634 in codegen_build (g=0x907a980) at > /home/andy/dev/zig/src/codegen.cpp:5484 > #26 0x0000000001d1d564 in main (argc=4, argv=0x7fffffffca18) > at /home/andy/dev/zig/src/main.cpp:666 > > > > Here's the smallest zig test case to cause the problem: > > > export fn entry() { > var bytes: []const u8 = "format"; > write(bytes); > } > > pub fn write(bytes: []const u8) { > var index: usize = 0; > > var src_index: usize = 0; > > while (src_index < bytes.len) { > const dest_space_left = 1 - index; > const b = bytes.len - src_index; > const copy_amt = if (dest_space_left < b) dest_space_left else b; > index += copy_amt; > src_index += copy_amt; > } > } > > pub fn panic(msg: []const u8) -> noreturn { while (true) {} } > > > compile with ./zig build_obj test.zig --release-safe > This does the equivalent of -O3 > > The IR that it produces; ModuleID = 'test' > source_filename = "test" > target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" > target triple = "x86_64-unknown-linux-gnu" > > %"[]u8" = type { i8*, i64 } > > @__zig_panic_implementation_provided = internal unnamed_addr constant i1 > true, align 1 > @0 = internal unnamed_addr constant i8* getelementptr inbounds ([6 x i8], > [6 x i8]* @1, i64 0, i64 0), align 8 > @1 = internal unnamed_addr constant [6 x i8] c"format", align 1 > @2 = internal unnamed_addr constant { i8*, i64 } { i8* getelementptr > inbounds ([6 x i8], [6 x i8]* @1, i64 0, i64 0), i64 6 }, align 8 > @3 = internal unnamed_addr constant i8* getelementptr inbounds ([16 x i8], > [16 x i8]* @4, i64 0, i64 0), align 8 > @4 = internal unnamed_addr constant [16 x i8] c"integer overflow", align 1 > @5 = internal unnamed_addr constant { i8*, i64 } { i8* getelementptr > inbounds ([16 x i8], [16 x i8]* @4, i64 0, i64 0), i64 16 }, align 8 > > ; Function Attrs: nobuiltin nounwind > define void @entry() #0 !dbg !16 { > Entry: > %bytes = alloca %"[]u8", align 8 > %0 = bitcast %"[]u8"* %bytes to i8*, !dbg !31 > call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ({ i8*, i64 }* > @2 to i8*), i64 16, i32 8, i1 false), !dbg !31 > call void @llvm.dbg.declare(metadata %"[]u8"* %bytes, metadata !22, > metadata !32), !dbg !31 > call fastcc void @write(%"[]u8"* byval %bytes), !dbg !33 > ret void, !dbg !35 > } > > ; Function Attrs: cold nobuiltin noreturn nounwind > define linkonce coldcc void @__zig_panic(i8* nonnull readonly, i64) #1 > !dbg !36 { > Entry: > %2 = alloca %"[]u8", align 8 > %message_ptr = alloca i8*, align 8 > %message_len = alloca i64, align 8 > store i8* %0, i8** %message_ptr, align 8 > call void @llvm.dbg.declare(metadata i8** %message_ptr, metadata !41, > metadata !32), !dbg !44 > store i64 %1, i64* %message_len, align 8 > call void @llvm.dbg.declare(metadata i64* %message_len, metadata !42, > metadata !32), !dbg !45 > %3 = load i64, i64* %message_len, align 8, !dbg !46 > %4 = load i8*, i8** %message_ptr, align 8, !dbg !50 > %5 = getelementptr inbounds %"[]u8", %"[]u8"* %2, i32 0, i32 0, !dbg !50 > %6 = getelementptr inbounds i8, i8* %4, i64 0, !dbg !50 > store i8* %6, i8** %5, align 8, !dbg !50 > %7 = getelementptr inbounds %"[]u8", %"[]u8"* %2, i32 0, i32 1, !dbg !50 > %8 = sub nsw i64 %3, 0, !dbg !50 > store i64 %8, i64* %7, align 8, !dbg !50 > call fastcc void @panic(%"[]u8"* byval %2), !dbg !51 > unreachable, !dbg !51 > } > > ; Function Attrs: nobuiltin nounwind > define internal fastcc void @write(%"[]u8"* byval nonnull readonly) > unnamed_addr #0 !dbg !52 { > Entry: > %index = alloca i64, align 8 > %src_index = alloca i64, align 8 > %dest_space_left = alloca i64, align 8 > %b = alloca i64, align 8 > %copy_amt = alloca i64, align 8 > call void @llvm.dbg.declare(metadata %"[]u8"* %0, metadata !57, metadata > !32), !dbg !70 > store i64 0, i64* %index, align 8, !dbg !71 > call void @llvm.dbg.declare(metadata i64* %index, metadata !58, metadata > !32), !dbg !71 > store i64 0, i64* %src_index, align 8, !dbg !72 > call void @llvm.dbg.declare(metadata i64* %src_index, metadata !61, > metadata !32), !dbg !72 > br label %WhileCond, !dbg !73 > > WhileCond: ; preds = %OverflowOk6, > %Entry > %1 = load i64, i64* %src_index, align 8, !dbg !74 > %2 = getelementptr inbounds %"[]u8", %"[]u8"* %0, i32 0, i32 1, !dbg !75 > %3 = load i64, i64* %2, align 8, !dbg !75 > %4 = icmp ult i64 %1, %3, !dbg !76 > br i1 %4, label %WhileBody, label %WhileEnd, !dbg !76 > > WhileBody: ; preds = %WhileCond > %5 = load i64, i64* %index, align 8, !dbg !77 > %6 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 1, i64 %5), !dbg > !78 > %7 = extractvalue { i64, i1 } %6, 0, !dbg !78 > %8 = extractvalue { i64, i1 } %6, 1, !dbg !78 > br i1 %8, label %OverflowFail, label %OverflowOk, !dbg !78 > > WhileEnd: ; preds = %WhileCond > ret void, !dbg !79 > > Then: ; preds = %OverflowOk2 > %9 = load i64, i64* %dest_space_left, align 8, !dbg !80 > br label %EndIf, !dbg !81 > > Else: ; preds = %OverflowOk2 > %10 = load i64, i64* %b, align 8, !dbg !82 > br label %EndIf, !dbg !81 > > EndIf: ; preds = %Else, %Then > %11 = phi i64 [ %9, %Then ], [ %10, %Else ], !dbg !81 > store i64 %11, i64* %copy_amt, align 8, !dbg !83 > call void @llvm.dbg.declare(metadata i64* %copy_amt, metadata !68, > metadata !32), !dbg !83 > %12 = load i64, i64* %index, align 8, !dbg !84 > %13 = load i64, i64* %copy_amt, align 8, !dbg !86 > %14 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %12, i64 %13), > !dbg !87 > %15 = extractvalue { i64, i1 } %14, 0, !dbg !87 > %16 = extractvalue { i64, i1 } %14, 1, !dbg !87 > br i1 %16, label %OverflowFail3, label %OverflowOk4, !dbg !87 > > OverflowFail: ; preds = %WhileBody > %17 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* > @5, i32 0, i32 0), align 8, !dbg !78 > %18 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* > @5, i32 0, i32 1), align 8, !dbg !78 > call coldcc void @__zig_panic(i8* %17, i64 %18), !dbg !78 > unreachable, !dbg !78 > > OverflowOk: ; preds = %WhileBody > store i64 %7, i64* %dest_space_left, align 8, !dbg !88 > call void @llvm.dbg.declare(metadata i64* %dest_space_left, metadata > !63, metadata !32), !dbg !88 > %19 = getelementptr inbounds %"[]u8", %"[]u8"* %0, i32 0, i32 1, !dbg !89 > %20 = load i64, i64* %19, align 8, !dbg !89 > %21 = load i64, i64* %src_index, align 8, !dbg !90 > %22 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %20, i64 %21), > !dbg !91 > %23 = extractvalue { i64, i1 } %22, 0, !dbg !91 > %24 = extractvalue { i64, i1 } %22, 1, !dbg !91 > br i1 %24, label %OverflowFail1, label %OverflowOk2, !dbg !91 > > OverflowFail1: ; preds = %OverflowOk > %25 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* > @5, i32 0, i32 0), align 8, !dbg !91 > %26 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* > @5, i32 0, i32 1), align 8, !dbg !91 > call coldcc void @__zig_panic(i8* %25, i64 %26), !dbg !91 > unreachable, !dbg !91 > > OverflowOk2: ; preds = %OverflowOk > store i64 %23, i64* %b, align 8, !dbg !92 > call void @llvm.dbg.declare(metadata i64* %b, metadata !66, metadata > !32), !dbg !92 > %27 = load i64, i64* %dest_space_left, align 8, !dbg !93 > %28 = load i64, i64* %b, align 8, !dbg !94 > %29 = icmp ult i64 %27, %28, !dbg !95 > br i1 %29, label %Then, label %Else, !dbg !95 > > OverflowFail3: ; preds = %EndIf > %30 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* > @5, i32 0, i32 0), align 8, !dbg !87 > %31 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* > @5, i32 0, i32 1), align 8, !dbg !87 > call coldcc void @__zig_panic(i8* %30, i64 %31), !dbg !87 > unreachable, !dbg !87 > > OverflowOk4: ; preds = %EndIf > store i64 %15, i64* %index, align 8, !dbg !87 > %32 = load i64, i64* %src_index, align 8, !dbg !96 > %33 = load i64, i64* %copy_amt, align 8, !dbg !97 > %34 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %32, i64 %33), > !dbg !98 > %35 = extractvalue { i64, i1 } %34, 0, !dbg !98 > %36 = extractvalue { i64, i1 } %34, 1, !dbg !98 > br i1 %36, label %OverflowFail5, label %OverflowOk6, !dbg !98 > > OverflowFail5: ; preds = %OverflowOk4 > %37 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* > @5, i32 0, i32 0), align 8, !dbg !98 > %38 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* > @5, i32 0, i32 1), align 8, !dbg !98 > call coldcc void @__zig_panic(i8* %37, i64 %38), !dbg !98 > unreachable, !dbg !98 > > OverflowOk6: ; preds = %OverflowOk4 > store i64 %35, i64* %src_index, align 8, !dbg !98 > br label %WhileCond, !dbg !73 > } > > ; Function Attrs: nobuiltin noreturn nounwind > define internal fastcc void @panic(%"[]u8"* byval nonnull readonly) > unnamed_addr #2 !dbg !99 { > Entry: > call void @llvm.dbg.declare(metadata %"[]u8"* %0, metadata !101, > metadata !32), !dbg !102 > br label %WhileCond, !dbg !103 > > WhileCond: ; preds = %WhileCond, > %Entry > br label %WhileCond, !dbg !103 > } > > ; Function Attrs: argmemonly nounwind > declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* > nocapture readonly, i64, i32, i1) #3 > > ; Function Attrs: nounwind readnone speculatable > declare void @llvm.dbg.declare(metadata, metadata, metadata) #4 > > ; Function Attrs: nounwind readnone speculatable > declare { i64, i1 } @llvm.usub.with.overflow.i64(i64, i64) #4 > > ; Function Attrs: nounwind readnone speculatable > declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) #4 > > attributes #0 = { nobuiltin nounwind } > attributes #1 = { cold nobuiltin noreturn nounwind } > attributes #2 = { nobuiltin noreturn nounwind } > attributes #3 = { argmemonly nounwind } > attributes #4 = { nounwind readnone speculatable } > > !llvm.module.flags = !{!0} > !llvm.dbg.cu = !{!1} > > !0 = !{i32 2, !"Debug Info Version", i32 3} > !1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, producer: > "zig 0.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, > enums: !3, globals: !12) > !2 = !DIFile(filename: "test", directory: ".") > !3 = !{!4} > !4 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "GlobalLinkage", > scope: !5, file: !5, line: 138, baseType: !6, size: 8, align: 8, elements: > !7) > !5 = !DIFile(filename: "builtin.zig", directory: "/home/andy/dev/zig/build- > llvm5-debug/zig-cache") > !6 = !DIBasicType(name: "u3", size: 8, encoding: DW_ATE_unsigned) > !7 = !{!8, !9, !10, !11} > !8 = !DIEnumerator(name: "Internal", value: 0) > !9 = !DIEnumerator(name: "Strong", value: 1) > !10 = !DIEnumerator(name: "Weak", value: 2) > !11 = !DIEnumerator(name: "LinkOnce", value: 3) > !12 = !{!13} > !13 = !DIGlobalVariableExpression(var: !14) > !14 = distinct !DIGlobalVariable(name: "__zig_panic_implementation_provided", > linkageName: "__zig_panic_implementation_provided", scope: !5, file: !5, > line: 201, type: !15, isLocal: true, isDefinition: true) > !15 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean) > !16 = distinct !DISubprogram(name: "entry", scope: !17, file: !17, type: > !18, isLocal: false, isDefinition: true, isOptimized: true, unit: !1, > variables: !21) > !17 = !DIFile(filename: "test.zig", directory: "/home/andy/dev/zig/build- > llvm5-debug") > !18 = !DISubroutineType(types: !19) > !19 = !{!20} > !20 = !DIBasicType(name: "void", encoding: DW_ATE_unsigned) > !21 = !{!22} > !22 = !DILocalVariable(name: "bytes", scope: !23, file: !17, line: 2, > type: !24) > !23 = distinct !DILexicalBlock(scope: !16, file: !17, line: 1, column: 19) > !24 = !DICompositeType(tag: DW_TAG_structure_type, name: "[]u8", size: > 128, align: 64, elements: !25) > !25 = !{!26, !29} > !26 = !DIDerivedType(tag: DW_TAG_member, name: "ptr", scope: !24, > baseType: !27, size: 64, align: 64) > !27 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "&u8", baseType: !28, > size: 64, align: 64) > !28 = !DIBasicType(name: "u8", size: 8, encoding: DW_ATE_unsigned_char) > !29 = !DIDerivedType(tag: DW_TAG_member, name: "len", scope: !24, > baseType: !30, size: 64, align: 64, offset: 64) > !30 = !DIBasicType(name: "usize", size: 64, encoding: DW_ATE_unsigned) > !31 = !DILocation(line: 2, column: 5, scope: !23) > !32 = !DIExpression() > !33 = !DILocation(line: 3, column: 10, scope: !34) > !34 = distinct !DILexicalBlock(scope: !23, file: !17, line: 2, column: 5) > !35 = !DILocation(line: 1, column: 19, scope: !16) > !36 = distinct !DISubprogram(name: "__zig_panic", scope: !37, file: !37, > line: 7, type: !38, isLocal: false, isDefinition: true, scopeLine: 7, > isOptimized: true, unit: !1, variables: !40) > !37 = !DIFile(filename: "zigrt.zig", directory: "/home/andy/dev/zig/build- > llvm5-debug/lib/zig/std/special") > !38 = !DISubroutineType(types: !39) > !39 = !{!20, !27, !30} > !40 = !{!41, !42} > !41 = !DILocalVariable(name: "message_ptr", arg: 1, scope: !36, file: !37, > line: 7, type: !27) > !42 = !DILocalVariable(name: "message_len", arg: 2, scope: !43, file: !37, > line: 7, type: !30) > !43 = distinct !DILexicalBlock(scope: !36, file: !37, line: 7, column: 30) > !44 = !DILocation(line: 7, column: 30, scope: !36) > !45 = !DILocation(line: 7, column: 54, scope: !43) > !46 = !DILocation(line: 12, column: 48, scope: !47) > !47 = distinct !DILexicalBlock(scope: !48, file: !37, line: 11, column: 54) > !48 = distinct !DILexicalBlock(scope: !49, file: !37, line: 7, column: 86) > !49 = distinct !DILexicalBlock(scope: !43, file: !37, line: 7, column: 54) > !50 = !DILocation(line: 12, column: 43, scope: !47) > !51 = !DILocation(line: 12, column: 31, scope: !47) > !52 = distinct !DISubprogram(name: "write", scope: !17, file: !17, line: > 6, type: !53, isLocal: true, isDefinition: true, scopeLine: 6, isOptimized: > true, unit: !1, variables: !56) > !53 = !DISubroutineType(types: !54) > !54 = !{!20, !55} > !55 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "&[]const u8", > baseType: !24, size: 64, align: 64) > !56 = !{!57, !58, !61, !63, !66, !68} > !57 = !DILocalVariable(name: "bytes", arg: 1, scope: !52, file: !17, line: > 6, type: !24) > !58 = !DILocalVariable(name: "index", scope: !59, file: !17, line: 7, > type: !30) > !59 = distinct !DILexicalBlock(scope: !60, file: !17, line: 6, column: 33) > !60 = distinct !DILexicalBlock(scope: !52, file: !17, line: 6, column: 14) > !61 = !DILocalVariable(name: "src_index", scope: !62, file: !17, line: 9, > type: !30) > !62 = distinct !DILexicalBlock(scope: !59, file: !17, line: 7, column: 5) > !63 = !DILocalVariable(name: "dest_space_left", scope: !64, file: !17, > line: 12, type: !30) > !64 = distinct !DILexicalBlock(scope: !65, file: !17, line: 11, column: 35) > !65 = distinct !DILexicalBlock(scope: !62, file: !17, line: 9, column: 5) > !66 = !DILocalVariable(name: "b", scope: !67, file: !17, line: 13, type: > !30) > !67 = distinct !DILexicalBlock(scope: !64, file: !17, line: 12, column: 9) > !68 = !DILocalVariable(name: "copy_amt", scope: !69, file: !17, line: 14, > type: !30) > !69 = distinct !DILexicalBlock(scope: !67, file: !17, line: 13, column: 9) > !70 = !DILocation(line: 6, column: 14, scope: !52) > !71 = !DILocation(line: 7, column: 5, scope: !59) > !72 = !DILocation(line: 9, column: 5, scope: !62) > !73 = !DILocation(line: 11, column: 5, scope: !65) > !74 = !DILocation(line: 11, column: 12, scope: !65) > !75 = !DILocation(line: 11, column: 29, scope: !65) > !76 = !DILocation(line: 11, column: 22, scope: !65) > !77 = !DILocation(line: 12, column: 37, scope: !64) > !78 = !DILocation(line: 12, column: 35, scope: !64) > !79 = !DILocation(line: 11, column: 5, scope: !60) > !80 = !DILocation(line: 14, column: 51, scope: !69) > !81 = !DILocation(line: 14, column: 26, scope: !69) > !82 = !DILocation(line: 14, column: 72, scope: !69) > !83 = !DILocation(line: 14, column: 9, scope: !69) > !84 = !DILocation(line: 15, column: 9, scope: !85) > !85 = distinct !DILexicalBlock(scope: !69, file: !17, line: 14, column: 9) > !86 = !DILocation(line: 15, column: 18, scope: !85) > !87 = !DILocation(line: 15, column: 15, scope: !85) > !88 = !DILocation(line: 12, column: 9, scope: !64) > !89 = !DILocation(line: 13, column: 24, scope: !67) > !90 = !DILocation(line: 13, column: 31, scope: !67) > !91 = !DILocation(line: 13, column: 29, scope: !67) > !92 = !DILocation(line: 13, column: 9, scope: !67) > !93 = !DILocation(line: 14, column: 30, scope: !69) > !94 = !DILocation(line: 14, column: 48, scope: !69) > !95 = !DILocation(line: 14, column: 46, scope: !69) > !96 = !DILocation(line: 16, column: 9, scope: !85) > !97 = !DILocation(line: 16, column: 22, scope: !85) > !98 = !DILocation(line: 16, column: 19, scope: !85) > !99 = distinct !DISubprogram(name: "panic", scope: !17, file: !17, line: > 20, type: !53, isLocal: true, isDefinition: true, scopeLine: 20, > isOptimized: true, unit: !1, variables: !100) > !100 = !{!101} > !101 = !DILocalVariable(name: "msg", arg: 1, scope: !99, file: !17, line: > 20, type: !24) > !102 = !DILocation(line: 20, column: 14, scope: !99) > !103 = !DILocation(line: 20, column: 45, scope: !104) > !104 = distinct !DILexicalBlock(scope: !105, file: !17, line: 20, column: > 43) > !105 = distinct !DILexicalBlock(scope: !99, file: !17, line: 20, column: > 14) > is the following, however clang 5 with assertions on does not hit the > assertion when run on this IR: > > > > Any pointers would be appreciated. >-------------- next part -------------- An HTML attachment was scrubbed... URL: <lists.llvm.org/pipermail/llvm-dev/attachments/20170917/55648897/attachment-0001.html>
Davide Italiano via llvm-dev
2017-Sep-17 18:12 UTC
[llvm-dev] assertion triggered since update to llvm 5
Can you please open a bug on bugzilla and attach the ir testcase? Your fix doesn't look right (just hiding the assertion failure) On Sep 17, 2017 10:45 AM, "Andrew Kelley via llvm-dev" < llvm-dev at lists.llvm.org> wrote:> What do you think about this patch? > > --- a/llvm/lib/Transforms/Scalar/NewGVN.cpp > +++ b/llvm/lib/Transforms/Scalar/NewGVN.cpp > @@ -732,7 +732,7 @@ private: > MemoryPhi *getMemoryAccess(const BasicBlock *) const; > template <class T, class Range> T *getMinDFSOfRange(const Range &) > const; > unsigned InstrToDFSNum(const Value *V) const { > - assert(isa<Instruction>(V) && "This should not be used for > MemoryAccesses"); > + assert(V == nullptr || (isa<Instruction>(V) && "This should not be > used for MemoryAccesses")); > return InstrDFS.lookup(V); > } > > > > On Sat, Sep 16, 2017 at 1:48 PM, Andrew Kelley <superjoe30 at gmail.com> > wrote: > >> When zig updated to llvm 5 we started hitting this assertion: >> >> zig: /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:106: >> static bool llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To >> = llvm::Instruction; From = llvm::Value]: Assertion `Val && "isa<> used on >> a null pointer"' failed. >> >> I wonder if however this was caused by an invalid assertion, because up >> the stack is >> #8 0x0000000004b58e68 in (anonymous namespace)::NewGVN::InstrToDFSNum >> (this=0x7fffffffaf80, >> V=0x0) at /home/andy/downloads/llvm-proj >> ect/llvm/lib/Transforms/Scalar/NewGVN.cpp:735 >> 735 assert(isa<Instruction>(V) && "This should not be used for >> MemoryAccesses"); >> >> >> With assertions off the code works fine. >> Can anyone provide some guidance? >> >> Here is a full backtrace: >> >> zig: /home/andy/downloads/llvm-project/llvm/include/llvm/Support/Casting.h:106: >> static bool llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To >> = llvm::Instruction; From = llvm::Value]: Assertion `Val && "isa<> used on >> a null pointer"' failed. >> >> Program received signal SIGABRT, Aborted. >> 0x00007ffff698f3d4 in raise () >> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/ >> libc.so.6 >> (gdb) bt >> #0 0x00007ffff698f3d4 in raise () >> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/ >> libc.so.6 >> #1 0x00007ffff699083a in abort () >> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/ >> libc.so.6 >> #2 0x00007ffff69881a7 in __assert_fail_base () >> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/ >> libc.so.6 >> #3 0x00007ffff6988252 in __assert_fail () >> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/ >> libc.so.6 >> #4 0x0000000002d70389 in llvm::isa_impl_cl<llvm::Instruction, >> llvm::Value const*>::doit ( >> Val=0x0) at /home/andy/downloads/llvm-proj >> ect/llvm/include/llvm/Support/Casting.h:106 >> #5 0x0000000002d4f8af in llvm::isa_impl_wrap<llvm::Instruction, >> llvm::Value const*, llvm::Value const*>::doit (Val=@0x7fffffffa678: 0x0) >> at /home/andy/downloads/llvm-project/llvm/include/llvm/Support/ >> Casting.h:133 >> #6 0x0000000002ece9a3 in llvm::isa_impl_wrap<llvm::Instruction, >> llvm::Value const* const, llvm::Value const*>::doit (Val=@0x7fffffffa6b0: >> 0x0) >> at /home/andy/downloads/llvm-project/llvm/include/llvm/Support/ >> Casting.h:125 >> #7 0x0000000002ecd4f4 in llvm::isa<llvm::Instruction, llvm::Value >> const*> ( >> Val=@0x7fffffffa6b0: 0x0) >> at /home/andy/downloads/llvm-project/llvm/include/llvm/Support/ >> Casting.h:144 >> #8 0x0000000004b58e68 in (anonymous namespace)::NewGVN::InstrToDFSNum >> (this=0x7fffffffaf80, >> V=0x0) at /home/andy/downloads/llvm-proj >> ect/llvm/lib/Transforms/Scalar/NewGVN.cpp:735 >> #9 0x0000000004b6870d in (anonymous namespace)::NewGVN::touchAndErase<llvm::DenseMap<llvm::Value >> const*, llvm::SmallPtrSet<llvm::Value*, 2u> >, llvm::Value*> >> (this=0x7fffffffaf80, M=..., >> Key=@0x7fffffffa790: 0x9154cf8) >> at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar >> /NewGVN.cpp:1930 >> #10 0x0000000004b5d9b7 in (anonymous namespace)::NewGVN::markUsersTouched >> (this=0x7fffffffaf80, >> V=0x9154cf8) at /home/andy/downloads/llvm-proj >> ect/llvm/lib/Transforms/Scalar/NewGVN.cpp:1946 >> #11 0x0000000004b5f141 in (anonymous namespace)::NewGVN::performCongruenceFinding >> ( >> this=0x7fffffffaf80, I=0x9154cf8, E=0x91d7b70) >> at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar >> /NewGVN.cpp:2269 >> #12 0x0000000004b62174 in (anonymous namespace)::NewGVN::valueNumberInstruction >> ( >> this=0x7fffffffaf80, I=0x9154cf8) >> at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar >> /NewGVN.cpp:2801 >> #13 0x0000000004b63b4f in (anonymous namespace)::NewGVN::iterateTouchedInstructions >> ( >> this=0x7fffffffaf80) >> at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar >> /NewGVN.cpp:3094 >> #14 0x0000000004b6431c in (anonymous namespace)::NewGVN::runGVN >> (this=0x7fffffffaf80) >> at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar >> /NewGVN.cpp:3165 >> #15 0x0000000004b678db in (anonymous namespace)::NewGVNLegacyPass::runOnFunction >> ( >> this=0x910ea50, F=...) >> at /home/andy/downloads/llvm-project/llvm/lib/Transforms/Scalar >> /NewGVN.cpp:3904 >> #16 0x00000000054d10fd in llvm::FPPassManager::runOnFunction >> (this=0x9102260, F=...) >> at /home/andy/downloads/llvm-project/llvm/lib/IR/LegacyPassMana >> ger.cpp:1514 >> #17 0x0000000004f2a375 in (anonymous namespace)::CGPassManager::RunPassOnSCC >> (this=0x9100f00, >> P=0x9102260, CurSCC=..., CG=..., CallGraphUpToDate=@0x7fffffffbc2f: >> true, >> DevirtualizedCall=@0x7fffffffbccf: false) >> at /home/andy/downloads/llvm-project/llvm/lib/Analysis/CallGrap >> hSCCPass.cpp:149 >> #18 0x0000000004f2b349 in (anonymous namespace)::CGPassManager::RunAllPassesOnSCC >> ( >> this=0x9100f00, CurSCC=..., CG=..., DevirtualizedCall=@0x7fffffffbccf: >> false) >> at /home/andy/downloads/llvm-project/llvm/lib/Analysis/CallGrap >> hSCCPass.cpp:419 >> #19 0x0000000004f2b643 in (anonymous namespace)::CGPassManager::runOnModule >> (this=0x9100f00, >> M=...) at /home/andy/downloads/llvm-proj >> ect/llvm/lib/Analysis/CallGraphSCCPass.cpp:474 >> #20 0x00000000054d15c1 in (anonymous namespace)::MPPassManager::runOnModule >> (this=0x90f9970, >> ---Type <return> to continue, or q <return> to quit--- >> M=...) at /home/andy/downloads/llvm-proj >> ect/llvm/lib/IR/LegacyPassManager.cpp:1591 >> #21 0x00000000054d1c73 in llvm::legacy::PassManagerImpl::run >> (this=0x90f9480, M=...) >> at /home/andy/downloads/llvm-project/llvm/lib/IR/LegacyPassMana >> ger.cpp:1694 >> #22 0x00000000054d1e7f in llvm::legacy::PassManager::run >> (this=0x7fffffffc010, M=...) >> at /home/andy/downloads/llvm-project/llvm/lib/IR/LegacyPassMana >> ger.cpp:1725 >> #23 0x0000000001d4017d in ZigLLVMTargetMachineEmitToFile >> (targ_machine_ref=0x9080d50, >> module_ref=0x907e870, filename=0x90cf360 "./zig-cache/test.o", >> file_type=LLVMObjectFile, >> error_message=0x7fffffffc2f8, is_debug=false) at >> /home/andy/dev/zig/src/zig_llvm.cpp:166 >> #24 0x0000000001cd041d in do_code_gen (g=0x907a980) at >> /home/andy/dev/zig/src/codegen.cpp:4379 >> #25 0x0000000001cd4634 in codegen_build (g=0x907a980) at >> /home/andy/dev/zig/src/codegen.cpp:5484 >> #26 0x0000000001d1d564 in main (argc=4, argv=0x7fffffffca18) >> at /home/andy/dev/zig/src/main.cpp:666 >> >> >> >> Here's the smallest zig test case to cause the problem: >> >> >> export fn entry() { >> var bytes: []const u8 = "format"; >> write(bytes); >> } >> >> pub fn write(bytes: []const u8) { >> var index: usize = 0; >> >> var src_index: usize = 0; >> >> while (src_index < bytes.len) { >> const dest_space_left = 1 - index; >> const b = bytes.len - src_index; >> const copy_amt = if (dest_space_left < b) dest_space_left else b; >> index += copy_amt; >> src_index += copy_amt; >> } >> } >> >> pub fn panic(msg: []const u8) -> noreturn { while (true) {} } >> >> >> compile with ./zig build_obj test.zig --release-safe >> This does the equivalent of -O3 >> >> The IR that it produces; ModuleID = 'test' >> source_filename = "test" >> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" >> target triple = "x86_64-unknown-linux-gnu" >> >> %"[]u8" = type { i8*, i64 } >> >> @__zig_panic_implementation_provided = internal unnamed_addr constant i1 >> true, align 1 >> @0 = internal unnamed_addr constant i8* getelementptr inbounds ([6 x i8], >> [6 x i8]* @1, i64 0, i64 0), align 8 >> @1 = internal unnamed_addr constant [6 x i8] c"format", align 1 >> @2 = internal unnamed_addr constant { i8*, i64 } { i8* getelementptr >> inbounds ([6 x i8], [6 x i8]* @1, i64 0, i64 0), i64 6 }, align 8 >> @3 = internal unnamed_addr constant i8* getelementptr inbounds ([16 x >> i8], [16 x i8]* @4, i64 0, i64 0), align 8 >> @4 = internal unnamed_addr constant [16 x i8] c"integer overflow", align 1 >> @5 = internal unnamed_addr constant { i8*, i64 } { i8* getelementptr >> inbounds ([16 x i8], [16 x i8]* @4, i64 0, i64 0), i64 16 }, align 8 >> >> ; Function Attrs: nobuiltin nounwind >> define void @entry() #0 !dbg !16 { >> Entry: >> %bytes = alloca %"[]u8", align 8 >> %0 = bitcast %"[]u8"* %bytes to i8*, !dbg !31 >> call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ({ i8*, i64 }* >> @2 to i8*), i64 16, i32 8, i1 false), !dbg !31 >> call void @llvm.dbg.declare(metadata %"[]u8"* %bytes, metadata !22, >> metadata !32), !dbg !31 >> call fastcc void @write(%"[]u8"* byval %bytes), !dbg !33 >> ret void, !dbg !35 >> } >> >> ; Function Attrs: cold nobuiltin noreturn nounwind >> define linkonce coldcc void @__zig_panic(i8* nonnull readonly, i64) #1 >> !dbg !36 { >> Entry: >> %2 = alloca %"[]u8", align 8 >> %message_ptr = alloca i8*, align 8 >> %message_len = alloca i64, align 8 >> store i8* %0, i8** %message_ptr, align 8 >> call void @llvm.dbg.declare(metadata i8** %message_ptr, metadata !41, >> metadata !32), !dbg !44 >> store i64 %1, i64* %message_len, align 8 >> call void @llvm.dbg.declare(metadata i64* %message_len, metadata !42, >> metadata !32), !dbg !45 >> %3 = load i64, i64* %message_len, align 8, !dbg !46 >> %4 = load i8*, i8** %message_ptr, align 8, !dbg !50 >> %5 = getelementptr inbounds %"[]u8", %"[]u8"* %2, i32 0, i32 0, !dbg !50 >> %6 = getelementptr inbounds i8, i8* %4, i64 0, !dbg !50 >> store i8* %6, i8** %5, align 8, !dbg !50 >> %7 = getelementptr inbounds %"[]u8", %"[]u8"* %2, i32 0, i32 1, !dbg !50 >> %8 = sub nsw i64 %3, 0, !dbg !50 >> store i64 %8, i64* %7, align 8, !dbg !50 >> call fastcc void @panic(%"[]u8"* byval %2), !dbg !51 >> unreachable, !dbg !51 >> } >> >> ; Function Attrs: nobuiltin nounwind >> define internal fastcc void @write(%"[]u8"* byval nonnull readonly) >> unnamed_addr #0 !dbg !52 { >> Entry: >> %index = alloca i64, align 8 >> %src_index = alloca i64, align 8 >> %dest_space_left = alloca i64, align 8 >> %b = alloca i64, align 8 >> %copy_amt = alloca i64, align 8 >> call void @llvm.dbg.declare(metadata %"[]u8"* %0, metadata !57, >> metadata !32), !dbg !70 >> store i64 0, i64* %index, align 8, !dbg !71 >> call void @llvm.dbg.declare(metadata i64* %index, metadata !58, >> metadata !32), !dbg !71 >> store i64 0, i64* %src_index, align 8, !dbg !72 >> call void @llvm.dbg.declare(metadata i64* %src_index, metadata !61, >> metadata !32), !dbg !72 >> br label %WhileCond, !dbg !73 >> >> WhileCond: ; preds = %OverflowOk6, >> %Entry >> %1 = load i64, i64* %src_index, align 8, !dbg !74 >> %2 = getelementptr inbounds %"[]u8", %"[]u8"* %0, i32 0, i32 1, !dbg !75 >> %3 = load i64, i64* %2, align 8, !dbg !75 >> %4 = icmp ult i64 %1, %3, !dbg !76 >> br i1 %4, label %WhileBody, label %WhileEnd, !dbg !76 >> >> WhileBody: ; preds = %WhileCond >> %5 = load i64, i64* %index, align 8, !dbg !77 >> %6 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 1, i64 %5), >> !dbg !78 >> %7 = extractvalue { i64, i1 } %6, 0, !dbg !78 >> %8 = extractvalue { i64, i1 } %6, 1, !dbg !78 >> br i1 %8, label %OverflowFail, label %OverflowOk, !dbg !78 >> >> WhileEnd: ; preds = %WhileCond >> ret void, !dbg !79 >> >> Then: ; preds = %OverflowOk2 >> %9 = load i64, i64* %dest_space_left, align 8, !dbg !80 >> br label %EndIf, !dbg !81 >> >> Else: ; preds = %OverflowOk2 >> %10 = load i64, i64* %b, align 8, !dbg !82 >> br label %EndIf, !dbg !81 >> >> EndIf: ; preds = %Else, %Then >> %11 = phi i64 [ %9, %Then ], [ %10, %Else ], !dbg !81 >> store i64 %11, i64* %copy_amt, align 8, !dbg !83 >> call void @llvm.dbg.declare(metadata i64* %copy_amt, metadata !68, >> metadata !32), !dbg !83 >> %12 = load i64, i64* %index, align 8, !dbg !84 >> %13 = load i64, i64* %copy_amt, align 8, !dbg !86 >> %14 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %12, i64 %13), >> !dbg !87 >> %15 = extractvalue { i64, i1 } %14, 0, !dbg !87 >> %16 = extractvalue { i64, i1 } %14, 1, !dbg !87 >> br i1 %16, label %OverflowFail3, label %OverflowOk4, !dbg !87 >> >> OverflowFail: ; preds = %WhileBody >> %17 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 >> }* @5, i32 0, i32 0), align 8, !dbg !78 >> %18 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 >> }* @5, i32 0, i32 1), align 8, !dbg !78 >> call coldcc void @__zig_panic(i8* %17, i64 %18), !dbg !78 >> unreachable, !dbg !78 >> >> OverflowOk: ; preds = %WhileBody >> store i64 %7, i64* %dest_space_left, align 8, !dbg !88 >> call void @llvm.dbg.declare(metadata i64* %dest_space_left, metadata >> !63, metadata !32), !dbg !88 >> %19 = getelementptr inbounds %"[]u8", %"[]u8"* %0, i32 0, i32 1, !dbg >> !89 >> %20 = load i64, i64* %19, align 8, !dbg !89 >> %21 = load i64, i64* %src_index, align 8, !dbg !90 >> %22 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %20, i64 %21), >> !dbg !91 >> %23 = extractvalue { i64, i1 } %22, 0, !dbg !91 >> %24 = extractvalue { i64, i1 } %22, 1, !dbg !91 >> br i1 %24, label %OverflowFail1, label %OverflowOk2, !dbg !91 >> >> OverflowFail1: ; preds = %OverflowOk >> %25 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 >> }* @5, i32 0, i32 0), align 8, !dbg !91 >> %26 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 >> }* @5, i32 0, i32 1), align 8, !dbg !91 >> call coldcc void @__zig_panic(i8* %25, i64 %26), !dbg !91 >> unreachable, !dbg !91 >> >> OverflowOk2: ; preds = %OverflowOk >> store i64 %23, i64* %b, align 8, !dbg !92 >> call void @llvm.dbg.declare(metadata i64* %b, metadata !66, metadata >> !32), !dbg !92 >> %27 = load i64, i64* %dest_space_left, align 8, !dbg !93 >> %28 = load i64, i64* %b, align 8, !dbg !94 >> %29 = icmp ult i64 %27, %28, !dbg !95 >> br i1 %29, label %Then, label %Else, !dbg !95 >> >> OverflowFail3: ; preds = %EndIf >> %30 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 >> }* @5, i32 0, i32 0), align 8, !dbg !87 >> %31 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 >> }* @5, i32 0, i32 1), align 8, !dbg !87 >> call coldcc void @__zig_panic(i8* %30, i64 %31), !dbg !87 >> unreachable, !dbg !87 >> >> OverflowOk4: ; preds = %EndIf >> store i64 %15, i64* %index, align 8, !dbg !87 >> %32 = load i64, i64* %src_index, align 8, !dbg !96 >> %33 = load i64, i64* %copy_amt, align 8, !dbg !97 >> %34 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %32, i64 %33), >> !dbg !98 >> %35 = extractvalue { i64, i1 } %34, 0, !dbg !98 >> %36 = extractvalue { i64, i1 } %34, 1, !dbg !98 >> br i1 %36, label %OverflowFail5, label %OverflowOk6, !dbg !98 >> >> OverflowFail5: ; preds = %OverflowOk4 >> %37 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 >> }* @5, i32 0, i32 0), align 8, !dbg !98 >> %38 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 >> }* @5, i32 0, i32 1), align 8, !dbg !98 >> call coldcc void @__zig_panic(i8* %37, i64 %38), !dbg !98 >> unreachable, !dbg !98 >> >> OverflowOk6: ; preds = %OverflowOk4 >> store i64 %35, i64* %src_index, align 8, !dbg !98 >> br label %WhileCond, !dbg !73 >> } >> >> ; Function Attrs: nobuiltin noreturn nounwind >> define internal fastcc void @panic(%"[]u8"* byval nonnull readonly) >> unnamed_addr #2 !dbg !99 { >> Entry: >> call void @llvm.dbg.declare(metadata %"[]u8"* %0, metadata !101, >> metadata !32), !dbg !102 >> br label %WhileCond, !dbg !103 >> >> WhileCond: ; preds = %WhileCond, >> %Entry >> br label %WhileCond, !dbg !103 >> } >> >> ; Function Attrs: argmemonly nounwind >> declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* >> nocapture readonly, i64, i32, i1) #3 >> >> ; Function Attrs: nounwind readnone speculatable >> declare void @llvm.dbg.declare(metadata, metadata, metadata) #4 >> >> ; Function Attrs: nounwind readnone speculatable >> declare { i64, i1 } @llvm.usub.with.overflow.i64(i64, i64) #4 >> >> ; Function Attrs: nounwind readnone speculatable >> declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) #4 >> >> attributes #0 = { nobuiltin nounwind } >> attributes #1 = { cold nobuiltin noreturn nounwind } >> attributes #2 = { nobuiltin noreturn nounwind } >> attributes #3 = { argmemonly nounwind } >> attributes #4 = { nounwind readnone speculatable } >> >> !llvm.module.flags = !{!0} >> !llvm.dbg.cu = !{!1} >> >> !0 = !{i32 2, !"Debug Info Version", i32 3} >> !1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, producer: >> "zig 0.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, >> enums: !3, globals: !12) >> !2 = !DIFile(filename: "test", directory: ".") >> !3 = !{!4} >> !4 = !DICompositeType(tag: DW_TAG_enumeration_type, name: >> "GlobalLinkage", scope: !5, file: !5, line: 138, baseType: !6, size: 8, >> align: 8, elements: !7) >> !5 = !DIFile(filename: "builtin.zig", directory: >> "/home/andy/dev/zig/build-llvm5-debug/zig-cache") >> !6 = !DIBasicType(name: "u3", size: 8, encoding: DW_ATE_unsigned) >> !7 = !{!8, !9, !10, !11} >> !8 = !DIEnumerator(name: "Internal", value: 0) >> !9 = !DIEnumerator(name: "Strong", value: 1) >> !10 = !DIEnumerator(name: "Weak", value: 2) >> !11 = !DIEnumerator(name: "LinkOnce", value: 3) >> !12 = !{!13} >> !13 = !DIGlobalVariableExpression(var: !14) >> !14 = distinct !DIGlobalVariable(name: "__zig_panic_implementation_provided", >> linkageName: "__zig_panic_implementation_provided", scope: !5, file: !5, >> line: 201, type: !15, isLocal: true, isDefinition: true) >> !15 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean) >> !16 = distinct !DISubprogram(name: "entry", scope: !17, file: !17, type: >> !18, isLocal: false, isDefinition: true, isOptimized: true, unit: !1, >> variables: !21) >> !17 = !DIFile(filename: "test.zig", directory: >> "/home/andy/dev/zig/build-llvm5-debug") >> !18 = !DISubroutineType(types: !19) >> !19 = !{!20} >> !20 = !DIBasicType(name: "void", encoding: DW_ATE_unsigned) >> !21 = !{!22} >> !22 = !DILocalVariable(name: "bytes", scope: !23, file: !17, line: 2, >> type: !24) >> !23 = distinct !DILexicalBlock(scope: !16, file: !17, line: 1, column: 19) >> !24 = !DICompositeType(tag: DW_TAG_structure_type, name: "[]u8", size: >> 128, align: 64, elements: !25) >> !25 = !{!26, !29} >> !26 = !DIDerivedType(tag: DW_TAG_member, name: "ptr", scope: !24, >> baseType: !27, size: 64, align: 64) >> !27 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "&u8", baseType: >> !28, size: 64, align: 64) >> !28 = !DIBasicType(name: "u8", size: 8, encoding: DW_ATE_unsigned_char) >> !29 = !DIDerivedType(tag: DW_TAG_member, name: "len", scope: !24, >> baseType: !30, size: 64, align: 64, offset: 64) >> !30 = !DIBasicType(name: "usize", size: 64, encoding: DW_ATE_unsigned) >> !31 = !DILocation(line: 2, column: 5, scope: !23) >> !32 = !DIExpression() >> !33 = !DILocation(line: 3, column: 10, scope: !34) >> !34 = distinct !DILexicalBlock(scope: !23, file: !17, line: 2, column: 5) >> !35 = !DILocation(line: 1, column: 19, scope: !16) >> !36 = distinct !DISubprogram(name: "__zig_panic", scope: !37, file: !37, >> line: 7, type: !38, isLocal: false, isDefinition: true, scopeLine: 7, >> isOptimized: true, unit: !1, variables: !40) >> !37 = !DIFile(filename: "zigrt.zig", directory: >> "/home/andy/dev/zig/build-llvm5-debug/lib/zig/std/special") >> !38 = !DISubroutineType(types: !39) >> !39 = !{!20, !27, !30} >> !40 = !{!41, !42} >> !41 = !DILocalVariable(name: "message_ptr", arg: 1, scope: !36, file: >> !37, line: 7, type: !27) >> !42 = !DILocalVariable(name: "message_len", arg: 2, scope: !43, file: >> !37, line: 7, type: !30) >> !43 = distinct !DILexicalBlock(scope: !36, file: !37, line: 7, column: 30) >> !44 = !DILocation(line: 7, column: 30, scope: !36) >> !45 = !DILocation(line: 7, column: 54, scope: !43) >> !46 = !DILocation(line: 12, column: 48, scope: !47) >> !47 = distinct !DILexicalBlock(scope: !48, file: !37, line: 11, column: >> 54) >> !48 = distinct !DILexicalBlock(scope: !49, file: !37, line: 7, column: 86) >> !49 = distinct !DILexicalBlock(scope: !43, file: !37, line: 7, column: 54) >> !50 = !DILocation(line: 12, column: 43, scope: !47) >> !51 = !DILocation(line: 12, column: 31, scope: !47) >> !52 = distinct !DISubprogram(name: "write", scope: !17, file: !17, line: >> 6, type: !53, isLocal: true, isDefinition: true, scopeLine: 6, isOptimized: >> true, unit: !1, variables: !56) >> !53 = !DISubroutineType(types: !54) >> !54 = !{!20, !55} >> !55 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "&[]const u8", >> baseType: !24, size: 64, align: 64) >> !56 = !{!57, !58, !61, !63, !66, !68} >> !57 = !DILocalVariable(name: "bytes", arg: 1, scope: !52, file: !17, >> line: 6, type: !24) >> !58 = !DILocalVariable(name: "index", scope: !59, file: !17, line: 7, >> type: !30) >> !59 = distinct !DILexicalBlock(scope: !60, file: !17, line: 6, column: 33) >> !60 = distinct !DILexicalBlock(scope: !52, file: !17, line: 6, column: 14) >> !61 = !DILocalVariable(name: "src_index", scope: !62, file: !17, line: 9, >> type: !30) >> !62 = distinct !DILexicalBlock(scope: !59, file: !17, line: 7, column: 5) >> !63 = !DILocalVariable(name: "dest_space_left", scope: !64, file: !17, >> line: 12, type: !30) >> !64 = distinct !DILexicalBlock(scope: !65, file: !17, line: 11, column: >> 35) >> !65 = distinct !DILexicalBlock(scope: !62, file: !17, line: 9, column: 5) >> !66 = !DILocalVariable(name: "b", scope: !67, file: !17, line: 13, type: >> !30) >> !67 = distinct !DILexicalBlock(scope: !64, file: !17, line: 12, column: 9) >> !68 = !DILocalVariable(name: "copy_amt", scope: !69, file: !17, line: 14, >> type: !30) >> !69 = distinct !DILexicalBlock(scope: !67, file: !17, line: 13, column: 9) >> !70 = !DILocation(line: 6, column: 14, scope: !52) >> !71 = !DILocation(line: 7, column: 5, scope: !59) >> !72 = !DILocation(line: 9, column: 5, scope: !62) >> !73 = !DILocation(line: 11, column: 5, scope: !65) >> !74 = !DILocation(line: 11, column: 12, scope: !65) >> !75 = !DILocation(line: 11, column: 29, scope: !65) >> !76 = !DILocation(line: 11, column: 22, scope: !65) >> !77 = !DILocation(line: 12, column: 37, scope: !64) >> !78 = !DILocation(line: 12, column: 35, scope: !64) >> !79 = !DILocation(line: 11, column: 5, scope: !60) >> !80 = !DILocation(line: 14, column: 51, scope: !69) >> !81 = !DILocation(line: 14, column: 26, scope: !69) >> !82 = !DILocation(line: 14, column: 72, scope: !69) >> !83 = !DILocation(line: 14, column: 9, scope: !69) >> !84 = !DILocation(line: 15, column: 9, scope: !85) >> !85 = distinct !DILexicalBlock(scope: !69, file: !17, line: 14, column: 9) >> !86 = !DILocation(line: 15, column: 18, scope: !85) >> !87 = !DILocation(line: 15, column: 15, scope: !85) >> !88 = !DILocation(line: 12, column: 9, scope: !64) >> !89 = !DILocation(line: 13, column: 24, scope: !67) >> !90 = !DILocation(line: 13, column: 31, scope: !67) >> !91 = !DILocation(line: 13, column: 29, scope: !67) >> !92 = !DILocation(line: 13, column: 9, scope: !67) >> !93 = !DILocation(line: 14, column: 30, scope: !69) >> !94 = !DILocation(line: 14, column: 48, scope: !69) >> !95 = !DILocation(line: 14, column: 46, scope: !69) >> !96 = !DILocation(line: 16, column: 9, scope: !85) >> !97 = !DILocation(line: 16, column: 22, scope: !85) >> !98 = !DILocation(line: 16, column: 19, scope: !85) >> !99 = distinct !DISubprogram(name: "panic", scope: !17, file: !17, line: >> 20, type: !53, isLocal: true, isDefinition: true, scopeLine: 20, >> isOptimized: true, unit: !1, variables: !100) >> !100 = !{!101} >> !101 = !DILocalVariable(name: "msg", arg: 1, scope: !99, file: !17, line: >> 20, type: !24) >> !102 = !DILocation(line: 20, column: 14, scope: !99) >> !103 = !DILocation(line: 20, column: 45, scope: !104) >> !104 = distinct !DILexicalBlock(scope: !105, file: !17, line: 20, column: >> 43) >> !105 = distinct !DILexicalBlock(scope: !99, file: !17, line: 20, column: >> 14) >> is the following, however clang 5 with assertions on does not hit the >> assertion when run on this IR: >> >> >> >> Any pointers would be appreciated. >> > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <lists.llvm.org/pipermail/llvm-dev/attachments/20170917/b7543a19/attachment.html>