aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-11-23 03:03:21 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-11-23 03:03:21 +0000
commit47fb954f7437250eda152ed4165af5ac1c0ec366 (patch)
tree7ca67a3ead5103cb27fd80f65f9e1abb92bf22a0 /test
parentd2703dec271d82c8c9d22afb835c07730fd25d47 (diff)
downloadexternal_llvm-47fb954f7437250eda152ed4165af5ac1c0ec366.zip
external_llvm-47fb954f7437250eda152ed4165af5ac1c0ec366.tar.gz
external_llvm-47fb954f7437250eda152ed4165af5ac1c0ec366.tar.bz2
Fix a crash in block placement due to an inner loop that happened to be
reversed in the function's original ordering, and we happened to encounter it while handling an outer unnatural CFG structure. Thanks to the test case reduced from GCC's source by Benjamin Kramer. This may also fix a crasher in gzip that Duncan reduced for me, but I haven't yet gotten to testing that one. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145094 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/CodeGen/X86/block-placement.ll41
1 files changed, 41 insertions, 0 deletions
diff --git a/test/CodeGen/X86/block-placement.ll b/test/CodeGen/X86/block-placement.ll
index 8a8bf13..05d6f81 100644
--- a/test/CodeGen/X86/block-placement.ll
+++ b/test/CodeGen/X86/block-placement.ll
@@ -503,3 +503,44 @@ lpad:
loop:
br label %loop
}
+
+define void @test_unnatural_cfg_backwards_inner_loop() {
+; Test that when we encounter an unnatural CFG structure after having formed
+; a chain for an inner loop which happened to be laid out backwards we don't
+; attempt to merge onto the wrong end of the inner loop just because we find it
+; first. This was reduced from a crasher in GCC's single source.
+;
+; CHECK: test_unnatural_cfg_backwards_inner_loop
+; CHECK: %entry
+; CHECK: %body
+; CHECK: %loop1
+; CHECK: %loop2b
+; CHECK: %loop2a
+
+entry:
+ br i1 undef, label %loop2a, label %body
+
+body:
+ br label %loop2a
+
+loop1:
+ %next.load = load i32** undef
+ br i1 %comp.a, label %loop2a, label %loop2b
+
+loop2a:
+ %var = phi i32* [ null, %entry ], [ null, %body ], [ %next.phi, %loop1 ]
+ %next.var = phi i32* [ null, %entry ], [ undef, %body ], [ %next.load, %loop1 ]
+ %comp.a = icmp eq i32* %var, null
+ br label %loop3
+
+loop2b:
+ %gep = getelementptr inbounds i32* %var.phi, i32 0
+ %next.ptr = bitcast i32* %gep to i32**
+ store i32* %next.phi, i32** %next.ptr
+ br label %loop3
+
+loop3:
+ %var.phi = phi i32* [ %next.phi, %loop2b ], [ %var, %loop2a ]
+ %next.phi = phi i32* [ %next.load, %loop2b ], [ %next.var, %loop2a ]
+ br label %loop1
+}