| // 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(); |
| } |