1 | // RUN: %clang_cc1 %s -O3 -emit-llvm -o - | FileCheck %s |
2 | // |
3 | // PR13214 |
4 | // No assumption may be made about the order that a frontend emits branch |
5 | // targets (basic blocks). However, the backend's basic block layout makes an |
6 | // attempt to preserve source order of control flow, and any bias toward source |
7 | // order must start with the frontend. |
8 | // |
9 | // Note that the frontend inverts branches to simplify the condition, so the |
10 | // order of a branch instruction's labels cannot be used as a source order bias. |
11 | |
12 | void calla(); |
13 | void callb(); |
14 | void callc(); |
15 | |
16 | // CHECK: @test1 |
17 | // CHECK: @calla |
18 | // CHECK: @callb |
19 | // CHECK: @callc |
20 | // CHECK: ret void |
21 | void test1(int a) { |
22 | if (a) |
23 | calla(); |
24 | else |
25 | callb(); |
26 | callc(); |
27 | } |
28 | |
29 | // CHECK: @test2 |
30 | // CHECK: @callb |
31 | // CHECK: @calla |
32 | // CHECK: @callc |
33 | // CHECK: ret void |
34 | void test2(int a) { |
35 | if (!a) |
36 | callb(); |
37 | else |
38 | calla(); |
39 | callc(); |
40 | } |
41 | |