]> granicus.if.org Git - clang/commitdiff
MachineBlockPlacement would prefer that clang lay out blocks in source order.
authorAndrew Trick <atrick@apple.com>
Tue, 26 Jun 2012 18:13:12 +0000 (18:13 +0000)
committerAndrew Trick <atrick@apple.com>
Tue, 26 Jun 2012 18:13:12 +0000 (18:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159215 91177308-0d34-0410-b5e6-96231b3b80d8

test/CodeGen/branch-target-layout.c [new file with mode: 0644]

diff --git a/test/CodeGen/branch-target-layout.c b/test/CodeGen/branch-target-layout.c
new file mode 100644 (file)
index 0000000..b93a0c7
--- /dev/null
@@ -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();
+}