aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2012-06-26 18:13:12 +0000
committerAndrew Trick <atrick@apple.com>2012-06-26 18:13:12 +0000
commit72c1a6a543c854ae18d629c9b5b3d89851880bf0 (patch)
treebcc630bc54d60c339ed463f3df3b6728e5b71e28
parent7e0f1ee35fe98d6751b9e736410f8254795b5f68 (diff)
MachineBlockPlacement would prefer that clang lay out blocks in source order.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159215 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/CodeGen/branch-target-layout.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/test/CodeGen/branch-target-layout.c b/test/CodeGen/branch-target-layout.c
new file mode 100644
index 0000000000..b93a0c7a4b
--- /dev/null
+++ b/test/CodeGen/branch-target-layout.c
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 %s -O3 -emit-llvm -o - | FileCheck %s
+//
+// PR13214
+// No assumption may be made about the order that a frontend emits branch
+// targets (basic blocks). However, the backend's basic block layout makes an
+// attempt to preserve source order of control flow, and any bias toward source
+// order must start with the frontend.
+//
+// Note that the frontend inverts branches to simplify the condition, so the
+// order of a branch instruction's labels cannot be used as a source order bias.
+
+void calla();
+void callb();
+void callc();
+
+// CHECK: @test
+// CHECK: @calla()
+// CHECK: @callb()
+// CHECK: @callc()
+// CHECK: ret void
+void test1(int a) {
+ if (a)
+ calla();
+ else
+ callb();
+ callc();
+}
+
+// CHECK: @test
+// CHECK: @callb()
+// CHECK: @calla()
+// CHECK: @callc()
+// CHECK: ret void
+void test2(int a) {
+ if (!a)
+ callb();
+ else
+ calla();
+ callc();
+}