mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-31 16:02:52 +01:00
96ecdfd8dd
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. llvm-svn: 166068
24 lines
587 B
LLVM
24 lines
587 B
LLVM
; RUN: llc -mtriple i386-unknown-linux-gnu -relocation-model=pic -verify-machineinstrs < %s
|
|
; We used to crash on this.
|
|
|
|
declare void @foo()
|
|
declare void @foo3(i1 %x)
|
|
define void @bar(i1 %a1, i16 %a2) nounwind align 2 {
|
|
bb0:
|
|
%a3 = trunc i16 %a2 to i8
|
|
%a4 = lshr i16 %a2, 8
|
|
%a5 = trunc i16 %a4 to i8
|
|
br i1 %a1, label %bb1, label %bb2
|
|
bb1:
|
|
br label %bb2
|
|
bb2:
|
|
%a6 = phi i8 [ 3, %bb0 ], [ %a5, %bb1 ]
|
|
%a7 = phi i8 [ 9, %bb0 ], [ %a3, %bb1 ]
|
|
%a8 = icmp eq i8 %a6, 1
|
|
call void @foo()
|
|
%a9 = icmp eq i8 %a7, 0
|
|
call void @foo3(i1 %a9)
|
|
call void @foo3(i1 %a8)
|
|
ret void
|
|
}
|