Avoid rematerializing a redef immediately after the old def.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 16 Oct 2012 22:51:58 +0000 (22:51 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 16 Oct 2012 22:51:58 +0000 (22:51 +0000)
commit320db3f8052c9f506d9ea043ba5da534df40aa08
tree8940e7352ef9f815644b8a4e4021f0d98be78ee0
parentcdcdfd2cab67366b1debbe36bf46c29f7fecda67
Avoid rematerializing a redef immediately after the old def.

PR14098 contains an example where we would rematerialize a MOV8ri
immediately after the original instruction:

  %vreg7:sub_8bit<def> = MOV8ri 9; GR32_ABCD:%vreg7
  %vreg22:sub_8bit<def> = MOV8ri 9; GR32_ABCD:%vreg7

Besides being pointless, it is also wrong since the original instruction
only redefines part of the register, and the value read by the new
instruction is wrong.

The problem was the LiveRangeEdit::allUsesAvailableAt() didn't
special-case OrigIdx == UseIdx and found the wrong SSA value.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166068 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/LiveRangeEdit.cpp
test/CodeGen/X86/pr14098.ll [new file with mode: 0644]