diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-08-05 18:47:07 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-08-05 18:47:07 +0000 |
| commit | d633abebf687bdde36986213bd04c813e7d676f0 (patch) | |
| tree | 648c4b76ecff92dd1dcb3f49c713b54995389c3e /llvm/lib/CodeGen/SplitKit.cpp | |
| parent | 30097b7c41f7ffa5a6b3fd2b7cb5c9a180b52990 (diff) | |
| download | llvm-d633abebf687bdde36986213bd04c813e7d676f0.zip llvm-d633abebf687bdde36986213bd04c813e7d676f0.tar.gz llvm-d633abebf687bdde36986213bd04c813e7d676f0.tar.bz2 | |
Fix liveness computations in BranchFolding.
The old code would look at kills and defs in one pass over the
instruction operands, causing problems with this code:
%R0<def>, %CPSR<def,dead> = tLSLri %R5<kill>, 2, pred:14, pred:%noreg
%R0<def>, %CPSR<def,dead> = tADDrr %R4<kill>, %R0<kill>, pred:14, %pred:%noreg
The last instruction kills and redefines %R0, so it is still live after
the instruction.
This caused a register scavenger crash when compiling 483.xalancbmk for
armv6. I am not including a test case because it requires too much bad
luck to expose this old bug.
First you need to convince the register allocator to use %R0 twice on
the tADDrr instruction, then you have to convince BranchFolding to do
something that causes it to run the register scavenger on he bad block.
<rdar://problem/9898200>
llvm-svn: 136973
Diffstat (limited to 'llvm/lib/CodeGen/SplitKit.cpp')
0 files changed, 0 insertions, 0 deletions
