[PATCH] D91734: [FastISel] Flush local value map on every instruction

Paul Robinson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 2 10:25:37 PST 2020


probinson added a comment.

@rnk is correct that the phi's source location is propagating to the xorl.  I modified the .ll file to put a different line number on the phi, and the xorl picked it up.  This is clearly on the front-end to get right.

If we want to get down to cases, there are other poor choices of source location in this tiny example.  The statement source is

  return a && b;

The 'a' is at column 10, the '&&' at 12, the 'b' at 15.
Now consider the load/test of 'a':

    %0 = load i32, i32* %a.addr, align 4, !dbg !19
    %tobool = icmp ne i32 %0, 0, !dbg !19
    br i1 %tobool, label %land.rhs, label %land.end, !dbg !20
  ...
  !19 = !DILocation(line: 3, column: 10, scope: !12)
  !20 = !DILocation(line: 3, column: 12, scope: !12)

The load and icmp both use !19, the source location of 'a' in the expression; the br uses !20, the '&&'.  All seems good. Now consider the 'b' part:

    %1 = load i32, i32* %b.addr, align 4, !dbg !21
    %tobool1 = icmp ne i32 %1, 0, !dbg !20
    br label %land.end
  ...
  !20 = !DILocation(line: 3, column: 12, scope: !12)
  !21 = !DILocation(line: 3, column: 15, scope: !12)

The load uses !21, 'b', but the icmp points to the '&&', and the br points nowhere.  This is at least inconsistent with how the LHS of the expression is handled, and I would argue it's actually wrong.

This gets reflected in the generated code:

  	.loc	1 0 0 prologue_end              # gdb-fail.c:0:0
  	xorl	%eax, %eax                      ;;;; because of the phi's line-0
                                          # kill: def $al killed $al killed $eax
  	.loc	1 3 10                          # gdb-fail.c:3:10
  	cmpl	$0, -4(%rbp)                    ;;;; load/compare of 'a' at column 10
  	movb	%al, -9(%rbp)                   # 1-byte Spill
  	.loc	1 3 12 is_stmt 0                # gdb-fail.c:3:12
  	je	.LBB1_2                         ;;;; the je attributed to the &&
  # %bb.1:                                # %land.rhs
  	cmpl	$0, -8(%rbp)                    ;;;; load/compare of 'b' at column 12 (??) not 15
  	setne	%al
  	movb	%al, -9(%rbp)                   # 1-byte Spill
  .LBB1_2:                                # %land.end
  	.loc	1 0 12                          # gdb-fail.c:0:12
  	movb	-9(%rbp), %al                   # 1-byte Reload

I'd also be happier if the reload was attributed to the same source location as the following instructions, but that's probably a whole 'nother can of worms.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D91734/new/

https://reviews.llvm.org/D91734



More information about the llvm-commits mailing list