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