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 > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170917/b7543a19/attachment.html>
Andrew Kelley via llvm-dev
2017-Sep-17 19:26 UTC
[llvm-dev] assertion triggered since update to llvm 5
I think I forgot to mention, the IR does not reproduce the problem. It has to be using the LLVM API. Some kind of in-memory state that gets fixed when serialized and deserialized with IR. On Sun, Sep 17, 2017 at 2:12 PM, Davide Italiano <davide at freebsd.org> wrote:> 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/l >>> ibc.so.6 >>> (gdb) bt >>> #0 0x00007ffff698f3d4 in raise () >>> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/l >>> ibc.so.6 >>> #1 0x00007ffff699083a in abort () >>> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/l >>> ibc.so.6 >>> #2 0x00007ffff69881a7 in __assert_fail_base () >>> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/l >>> ibc.so.6 >>> #3 0x00007ffff6988252 in __assert_fail () >>> from /nix/store/s7dw1yngwiskqa2ac1bkc6m9g7740agg-glibc-2.25/lib/l >>> ibc.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 >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >>-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170917/056151bb/attachment.html>
Daniel Berlin via llvm-dev
2017-Sep-17 19:47 UTC
[llvm-dev] assertion triggered since update to llvm 5
So, 90% of the time I've seen this, it was memory corruption, usually use after free. I know I fixed one after 5.0 branched. You should compile with address sanitizer enabled, and I suspect you will find the issue quicky. If not, we really need ir that reproduces it. On Sun, Sep 17, 2017, 12:27 PM Andrew Kelley via llvm-dev < llvm-dev at lists.llvm.org> wrote:> I think I forgot to mention, the IR does not reproduce the problem. It has > to be using the LLVM API. Some kind of in-memory state that gets fixed when > serialized and deserialized with IR. > > > On Sun, Sep 17, 2017 at 2:12 PM, Davide Italiano <davide at freebsd.org> > wrote: > >> 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-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. >>>> >>> >>> >>> _______________________________________________ >>> LLVM Developers mailing list >>> llvm-dev at lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>> >>> > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170917/57b65ad2/attachment-0001.html>