[llvm] r221628 - [AArch64][FastISel] Fix kill flags for integer extends.

Juergen Ributzka juergen at apple.com
Mon Nov 10 13:05:31 PST 2014


Author: ributzka
Date: Mon Nov 10 15:05:31 2014
New Revision: 221628

URL: http://llvm.org/viewvc/llvm-project?rev=221628&view=rev
Log:
[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.

Added:
    llvm/trunk/test/CodeGen/AArch64/fast-isel-int-ext4.ll
Modified:
    llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp

Modified: llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp?rev=221628&r1=221627&r2=221628&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp Mon Nov 10 15:05:31 2014
@@ -4197,6 +4197,14 @@ bool AArch64FastISel::selectIntExt(const
             .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;
     }

Added: llvm/trunk/test/CodeGen/AArch64/fast-isel-int-ext4.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/fast-isel-int-ext4.ll?rev=221628&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/fast-isel-int-ext4.ll (added)
+++ llvm/trunk/test/CodeGen/AArch64/fast-isel-int-ext4.ll Mon Nov 10 15:05:31 2014
@@ -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
+}





More information about the llvm-commits mailing list