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