aboutsummaryrefslogtreecommitdiffstats
path: root/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2009-05-07 23:47:03 +0000
committerBob Wilson <bob.wilson@apple.com>2009-05-07 23:47:03 +0000
commita43eb6bb7064b0fe2d441a05e9d13bc811bd729b (patch)
tree0ea9ab6c413f83ea7c445746f55857583ec182f6 /test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll
parent219866c4588318c77387bb64eb2a91f728cd183a (diff)
downloadexternal_llvm-a43eb6bb7064b0fe2d441a05e9d13bc811bd729b.zip
external_llvm-a43eb6bb7064b0fe2d441a05e9d13bc811bd729b.tar.gz
external_llvm-a43eb6bb7064b0fe2d441a05e9d13bc811bd729b.tar.bz2
Fix pr4100. Do not remove no-op copies when they are dead. The register
scavenger gets confused about register liveness if it doesn't see them. I'm not thrilled with this solution, but it only comes up when there are dead copies in the code, which is something that hopefully doesn't happen much. Here is what happens in pr4100: As shown in the following excerpt from the debug output of llc, the source of a move gets reloaded from the stack, inserting a new load instruction before the move. Since that source operand is a kill, the physical register is free to be reused for the destination of the move. The move ends up being a no-op, copying R3 to R3, so it is deleted. But, it leaves behind the load to reload %reg1028 into R3, and that load is not updated to show that it's destination operand (R3) is dead. The scavenger gets confused by that load because it thinks that R3 is live. Starting RegAlloc of: %reg1025<def,dead> = MOVr %reg1028<kill>, 14, %reg0, %reg0 Regs have values: Reloading %reg1028 into R3 Last use of R3[%reg1028], removing it from live set Assigning R3 to %reg1025 Register R3 [%reg1025] is never used, removing it from live set Alternative solutions might be either marking the load as dead, or zapping the load along with the no-op copy. I couldn't see an easy way to do either of those, though. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71196 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll')
-rw-r--r--test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll12
1 files changed, 12 insertions, 0 deletions
diff --git a/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll b/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll
new file mode 100644
index 0000000..d03b7ce
--- /dev/null
+++ b/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll
@@ -0,0 +1,12 @@
+; RUN: llvm-as < %s | llc -mtriple=armv5-unknown-linux-gnueabi -O0 -regalloc=local
+; PR4100
+@.str = external constant [30 x i8] ; <[30 x i8]*> [#uses=1]
+
+define i16 @fn16(i16 %arg0.0, <2 x i16> %arg1, i16 %arg2.0) nounwind {
+entry:
+ store <2 x i16> %arg1, <2 x i16>* null
+ %0 = call i32 (i8*, ...)* @printf(i8* getelementptr ([30 x i8]* @.str, i32 0, i32 0), i32 0) nounwind ; <i32> [#uses=0]
+ ret i16 0
+}
+
+declare i32 @printf(i8*, ...) nounwind