[AArch64][FastISel] Fix kill flags for integer extends.

In the case we optimize an integer extend away and replace it directly with the
source register, we also have to clear all kill flags at all its uses.
This is necessary, because the orignal IR instruction might be trivially dead,
but we replaced it with a nop at MI level.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221628 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Juergen Ributzka 2014-11-10 21:05:31 +00:00
parent d0995fb982
commit 1b9706b8c6
2 changed files with 28 additions and 0 deletions

View File

@ -4197,6 +4197,14 @@ bool AArch64FastISel::selectIntExt(const Instruction *I) {
.addImm(AArch64::sub_32);
SrcReg = ResultReg;
}
// Conservatively clear all kill flags from all uses, because we are
// replacing a sign-/zero-extend instruction at IR level with a nop at MI
// level. The result of the instruction at IR level might have been
// trivially dead, which is now not longer true.
unsigned UseReg = lookUpRegForValue(I);
if (UseReg)
MRI.clearKillFlags(UseReg);
updateValueMap(I, SrcReg);
return true;
}

View File

@ -0,0 +1,20 @@
; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort -verify-machineinstrs < %s | FileCheck %s
define i32 @kill_flag(i16 signext %a) {
; CHECK-LABEL: kill_flag
entry:
%0 = sext i16 %a to i32
br label %bb1
bb1:
%1 = icmp slt i32 undef, %0
br i1 %1, label %loop, label %exit
loop:
%2 = sext i16 %a to i32
%3 = icmp slt i32 undef, %2
br i1 %3, label %bb1, label %exit
exit:
ret i32 0
}