41 lines
		
	
	
		
			873 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			873 B
		
	
	
	
		
			C
		
	
	
	
| // 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();
 | |
| }
 |