Quuxplusone / LLVMBugzillaTest

0 stars 0 forks source link

LiveIn lists for MBBs are incorrect #25262

Closed Quuxplusone closed 8 years ago

Quuxplusone commented 8 years ago
Bugzilla Link PR25263
Status RESOLVED FIXED
Importance P normal
Reported by Jonas Paulsson (paulsson@linux.vnet.ibm.com)
Reported on 2015-10-20 11:40:12 -0700
Last modified on 2016-07-12 13:46:44 -0700
Version trunk
Hardware PC Linux
CC compnerd@compnerd.org, hfinkel@anl.gov, jsweval@arxan.com, llvm-bugs@lists.llvm.org, matze@braunis.de
Fixed by commit(s)
Attachments c-typeck.reduced.bc (19840 bytes, application/octet-stream)
Blocks
Blocked by
See also
Created attachment 15123
clang input

The provided test case shows that the LiveIn lists for some MBB have been
filled with long lists of non-live registers. This seems to happen after
Control Flow Optimizer, and after If Converter. Target is SystemZ.

Test case provided. It is reduced, but still have two small functions due to
inlining results required to reproduce the interesting function.

Run with:
./bin/clang -cc1 -triple s390x-ibm-linux-gnu -S -disable-free -mrelocation-
model static -mthread-model posix -fmath-errno -target-cpu z13 -momit-leaf-
frame-pointer -v -O3 -funroll-loops -vectorize-loops -vectorize-slp -o c-
typeck.reduced.s -x ir c-typeck.reduced.bc -mllvm -print-machineinstrs >& out

The file 'out' will have the printed instructions.
The 'build_function_call' function displays the problem.

In the fragments of the dump below, it is clear that some return-blocks or
their fall-through predecessor have very long lists of live-in regs that do not
belong there. This is bad because it will make later optimizations more limited
- for instance those using LivePhysRegs for liveness tracking.

# After Control Flow Optimizer:

BB#114: derived from LLVM BB %cleanup
    Live Ins: %V8 %V9 %V10 %V11 %V12 %V13 %V14 %V15 %F8D %F9D %F10D %F11D %F12D %F13D %F14D %F15D %F8Q %F9Q %F12Q %F13Q %F8S %F9S %F10S %F11S %F12S %F13S %F14S %F15S %R2D %R3D %R2
H %R3H %R2L %R3L %R2Q %V8 %V9 %V10 %V11 %V12 %V13 %V14 %V15 %F8D %F9D %F10D
%F11D %F12D %F13D %F14D %F15D %F8Q %F9Q %F12Q %F13Q %F8S %F9S %F10S %F11S %F12S
%F13S %F14S %F15S %R2D
%R2H %R2L %R2Q %V8 %V9 %V10 %V11 %V12 %V13 %V14 %V15 %F8D %F9D %F10D %F11D
%F12D %F13D %F14D %F15D %F8Q %F9Q %F12Q %F13Q %F8S %F9S %F10S %F11S %F12S %F13S
%F14S %F15S
    Predecessors according to CFG: BB#113 BB#12 BB#10
        %R2D<def> = LGRL <ga:@global_trees>; mem:LD8[getelementptr inbounds ([51 x %union.tree_node*], [51 x %union.tree_node*]* @global_trees, i64 0, i64 0)](tbaa=!3)
    Successors according to CFG: BB#115

BB#115: derived from LLVM BB %cleanup
    Live Ins: %R2D
    Predecessors according to CFG: BB#106 BB#110 BB#108 BB#112 BB#114 BB#109
        %R6D<def>, %R15D<def> = LMG %R15D, 248, %R7D<imp-def>, %R8D<imp-def>, %R9D<imp-def>, %R10D<imp-def>, %R11D<imp-def>, %R12D<imp-def>, %R13D<imp-def>, %R14D<imp-def>
        Return %R2D<imp-use>

# After If Converter:

BB#114:
    Live Ins: %R1D %V8 %V9 %V10 %V11 %V12 %V13 %V14 %V15 %F8D %F9D %F10D %F11D %F12D %F13D %F14D %F15D %F8Q %F9Q %F12Q %F13Q %F8S %F9S %F10S %F11S %F12S %F13S %F14S %F15S %R1D %R1H %R1L %R0Q
    Predecessors according to CFG: BB#107 BB#110
        %R2D<def> = LGR %R1D<kill>
        %R6D<def>, %R15D<def> = LMG %R15D, 248, %R7D<imp-def>, %R8D<imp-def>, %R9D<imp-def>, %R10D<imp-def>, %R11D<imp-def>, %R12D<imp-def>, %R13D<imp-def>, %R14D<imp-def>
        Return %R2D<imp-use>
Quuxplusone commented 8 years ago

Attached c-typeck.reduced.bc (19840 bytes, application/octet-stream): clang input

Quuxplusone commented 8 years ago

This is probably caused by the BranchFolder adding all the pristine register as well as all subregisters. I may have accidentally fixed this here: http://reviews.llvm.org/D22027

Quuxplusone commented 8 years ago

I tried confirming my guess that D22027 fixes this, but when I run the (huge) reproducer through llc I don't get any BB#114

Quuxplusone commented 8 years ago

Marking this as fixed now that http://reviews.llvm.org/D22027 has landed in r275201.

I believe it to be fixed even though I cannot reproduce with the original testcase. Please verify and re-open if necessary.