aboutsummaryrefslogtreecommitdiffstats
path: root/test/CodeGen/X86/vortex-bug.ll
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-05-15 23:26:57 +0000
committerDan Gohman <gohman@apple.com>2008-05-15 23:26:57 +0000
commitf20d70d57e1723d70b48b3f19868e17b9282bbfc (patch)
tree6b5eb783505c5c1116224c0c1ba6f2744cb01998 /test/CodeGen/X86/vortex-bug.ll
parent7d75b3a2819b10c3693de68d2fd62a6d079c88e5 (diff)
downloadexternal_llvm-f20d70d57e1723d70b48b3f19868e17b9282bbfc.zip
external_llvm-f20d70d57e1723d70b48b3f19868e17b9282bbfc.tar.gz
external_llvm-f20d70d57e1723d70b48b3f19868e17b9282bbfc.tar.bz2
Fix a bug in LoopStrengthReduce that caused it to emit IR with
use-before-def. The problem comes up in code with multiple PHIs where one PHI is being rewritten in terms of the other, but the other needs to be casted first. LLVM rules requre the cast instruction to be inserted after any PHI instructions, but when instructions were inserted to replace the second PHI value with a function of the first, they were ended up going before the cast instruction. Avoid this problem by remembering the location of the cast instruction, when one is needed, and inserting the expansion of the new value after it. This fixes a bug that surfaced in 255.vortex on x86-64 when instcombine was removed from the middle of the loop optimization passes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51169 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/X86/vortex-bug.ll')
-rw-r--r--test/CodeGen/X86/vortex-bug.ll21
1 files changed, 21 insertions, 0 deletions
diff --git a/test/CodeGen/X86/vortex-bug.ll b/test/CodeGen/X86/vortex-bug.ll
new file mode 100644
index 0000000..680bfbd
--- /dev/null
+++ b/test/CodeGen/X86/vortex-bug.ll
@@ -0,0 +1,21 @@
+; RUN: llvm-as < %s | llc -march=x86
+
+ %struct.blktkntype = type { i32, i32 }
+ %struct.fieldstruc = type { [128 x i8], %struct.blktkntype*, i32, i32 }
+
+define fastcc i32 @Env_GetFieldStruc(i8* %FieldName, i32* %Status, %struct.fieldstruc* %FieldStruc) nounwind {
+entry:
+ br label %bb137.i
+
+bb137.i: ; preds = %bb137.i, %entry
+ %FieldName_addr.0209.rec.i = phi i64 [ %tmp139.rec.i, %bb137.i ], [ 0, %entry ] ; <i64> [#uses=1]
+ %tmp147213.i = phi i32 [ %tmp147.i, %bb137.i ], [ 1, %entry ] ; <i32> [#uses=2]
+ %tmp139.rec.i = add i64 %FieldName_addr.0209.rec.i, 1 ; <i64> [#uses=2]
+ %tmp141142.i = sext i32 %tmp147213.i to i64 ; <i64> [#uses=0]
+ %tmp147.i = add i32 %tmp147213.i, 1 ; <i32> [#uses=1]
+ br i1 false, label %bb137.i, label %bb149.i.loopexit
+
+bb149.i.loopexit: ; preds = %bb137.i
+ %tmp139.i = getelementptr i8* %FieldName, i64 %tmp139.rec.i ; <i8*> [#uses=0]
+ unreachable
+}