summaryrefslogtreecommitdiffstats
path: root/test/CodeGen/branch-target-layout.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen/branch-target-layout.c')
-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 0000000..a6475d7
--- /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: @test1
+// CHECK: @calla
+// CHECK: @callb
+// CHECK: @callc
+// CHECK: ret void
+void test1(int a) {
+ if (a)
+ calla();
+ else
+ callb();
+ callc();
+}
+
+// CHECK: @test2
+// CHECK: @callb
+// CHECK: @calla
+// CHECK: @callc
+// CHECK: ret void
+void test2(int a) {
+ if (!a)
+ callb();
+ else
+ calla();
+ callc();
+}
OpenPOWER on IntegriCloud