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:
<http://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:
<http://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 > 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>