https://llvm.org/bugs/show_bug.cgi?id=26679
Bug ID: 26679 Summary: [WinEH] bad codegen in continuation after catch handler Product: new-bugs Version: 3.8 Hardware: PC OS: Windows NT Status: NEW Severity: normal Priority: P Component: new bugs Assignee: unassignedb...@nondot.org Reporter: r.sagita...@gmx.de CC: llvm-bugs@lists.llvm.org Classification: Unclassified The attached ccc.ll shows bad code generation for the code executed after the catch handler: the register rsi is used but is never initialized. Here's the initial part of the function: ////////////////////////// ; Function Attrs: uwtable define void @_D3csv9CsvRecord5primeMFZv(%csv.CsvRecord* nocapture nonnull readonly %.this_arg) #0 personality i32 (i8*, i8*, i8*, i8*)* @__CxxFrameHandler3 { assertPassed: %ice = alloca %csv.IncompleteCellException*, align 8 ; [#uses = 3, size/byte = 8] %0 = getelementptr inbounds %csv.CsvRecord, %csv.CsvRecord* %.this_arg, i64 0, i32 0 ; [#uses = 1, type = %csv.Input**] %1 = load %csv.Input*, %csv.Input** %0, align 8 ; [#uses = 2] %2 = getelementptr inbounds %csv.CsvRecord, %csv.CsvRecord* %.this_arg, i64 0, i32 1 ; [#uses = 1, type = i8*] %.elt = getelementptr inbounds %csv.Input, %csv.Input* %1, i64 0, i32 0, i32 0 ; [#uses = 1, type = i64*] %.unpack = load i64, i64* %.elt, align 8 ; [#uses = 1] %3 = insertvalue { i64, i8* } undef, i64 %.unpack, 0 ; [#uses = 1] %.elt1 = getelementptr inbounds %csv.Input, %csv.Input* %1, i64 0, i32 0, i32 1 ; [#uses = 1, type = i8**] %.unpack2 = load i8*, i8** %.elt1, align 8 ; [#uses = 1] %4 = insertvalue { i64, i8* } %3, i8* %.unpack2, 1 ; [#uses = 1] %5 = getelementptr inbounds %csv.CsvRecord, %csv.CsvRecord* %.this_arg, i64 0, i32 3, i32 0 ; [#uses = 2, type = %csv.Appender.Data**] %.unpack3 = load %csv.Appender.Data*, %csv.Appender.Data** %5, align 8 ; [#uses = 1] %6 = insertvalue %csv.Appender undef, %csv.Appender.Data* %.unpack3, 0 ; [#uses = 1] %7 = load i8, i8* %2, align 1 ; [#uses = 1] invoke void @_D3csv33__T12csvNextTokenTS3csv8AppenderZ12csvNextTokenFAyaS3csv8AppenderaZv(i8 %7, %csv.Appender %6, { i64, i8* } %4) to label %try.success.or.caught unwind label %catch.dispatch catch.csv.IncompleteCellException: ; preds = %catch.dispatch %8 = catchpad within %9 [%rtti.TypeDescriptor28* @"Dcsv.IncompleteCellException@TypeDescriptor", i32 0, %csv.IncompleteCellException** %ice] ; [#uses = 1] catchret from %8 to label %catchhandler try.success.or.caught: ; preds = %assertPassed, %_D6object11__T4idupTwZ4idupFNaNbNdNfAwZAyw.exit ret void catch.dispatch: ; preds = %assertPassed %9 = catchswitch within none [label %catch.csv.IncompleteCellException] unwind to caller ; [#uses = 1] catchhandler: ; preds = %catch.csv.IncompleteCellException %10 = bitcast %csv.IncompleteCellException** %ice to i8* ; [#uses = 1] %11 = call %object.Object* @_d_eh_enter_catch(i8* %10, %object.TypeInfo_Class* nonnull @_D3csv23IncompleteCellException7__ClassZ) ; [#uses = 0] %12 = load %csv.IncompleteCellException*, %csv.IncompleteCellException** %ice, align 8 ; [#uses = 2] %13 = load %csv.Appender.Data*, %csv.Appender.Data** %5, align 8 ; [#uses = 3] %14 = icmp eq %csv.Appender.Data* %13, null ; [#uses = 1] br i1 %14, label %_D3csv8Appender4dataMFZAw.exit, label %condtrue.i /////////////////// with the respective asm output: /////////////////// .text .def _D3csv9CsvRecord5primeMFZv; .scl 2; .type 32; .endef .globl _D3csv9CsvRecord5primeMFZv .align 16, 0x90 _D3csv9CsvRecord5primeMFZv: # @_D3csv9CsvRecord5primeMFZv .Lfunc_begin0: .Ltmp2: .seh_proc _D3csv9CsvRecord5primeMFZv .seh_handler __CxxFrameHandler3, @unwind, @except # BB#0: # %assertPassed pushq %rbp .Ltmp3: .seh_pushreg 5 pushq %r15 .Ltmp4: .seh_pushreg 15 pushq %r14 .Ltmp5: .seh_pushreg 14 pushq %r13 .Ltmp6: .seh_pushreg 13 pushq %r12 .Ltmp7: .seh_pushreg 12 pushq %rsi .Ltmp8: .seh_pushreg 6 pushq %rdi .Ltmp9: .seh_pushreg 7 pushq %rbx .Ltmp10: .seh_pushreg 3 subq $56, %rsp .Ltmp11: .seh_stackalloc 56 leaq 48(%rsp), %rbp .Ltmp12: .seh_setframe 5, 48 .Ltmp13: .seh_endprologue movq $-2, (%rbp) movq %rcx, -16(%rbp) # 8-byte Spill movq (%rcx), %rax movq 16(%rcx), %rdx movq (%rax), %r8 movq 8(%rax), %r9 movzbl 8(%rcx), %ecx .Ltmp0: callq _D3csv33__T12csvNextTokenTS3csv8AppenderZ12csvNextTokenFAyaS3csv8AppenderaZv .Ltmp1: .LBB0_1: # %try.success.or.caught nop addq $56, %rsp popq %rbx popq %rdi popq %rsi popq %r12 popq %r13 popq %r14 popq %r15 popq %rbp retq .LBB0_2: # Block address taken # %catchhandler leaq _D3csv23IncompleteCellException7__ClassZ(%rip), %rdx leaq -8(%rbp), %rcx callq _d_eh_enter_catch movq -8(%rbp), %r15 movq 16(%rsi), %rax xorl %ebx, %ebx testq %rax, %rax movl $0, %edi je .LBB0_4 # BB#3: # %condtrue.i /////////////////// Please note that %5 in the IR seems to be assumed in %rsi, but it is never loaded. The ccc.ll is a reduced version of csv_opt.ll generated by the LLVM based D compiler. It can also be generated by optimizing csv_noopt.ll with "opt -O2". The latter that does not have the problem. -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs