75 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; pr23772 - [ARM] r226200 can emit illegal thumb2 instruction: "sub sp, r12, #80"
 | |
| ; RUN: llc -march=thumb -mcpu=cortex-m3 -O3 -filetype=asm -o - %s | FileCheck %s
 | |
| ; CHECK-NOT: sub{{.*}} sp, r{{.*}}, #
 | |
| ; CHECK:     .fnend
 | |
| ; TODO: Missed optimization. The three instructions generated to subtract SP can be converged to a single one
 | |
| target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32"
 | |
| target triple = "thumbv7m-unknown-unknown"
 | |
| %B = type {%B*}
 | |
| %R = type {i32}
 | |
| %U = type {%U*, i8, i8}
 | |
| %E = type {%B*, %U*}
 | |
| %X = type {i32, i8, i8}
 | |
| declare external [0 x i8]* @memalloc(i32, i32, i32)
 | |
| declare external void @memfree([0 x i8]*, i32, i32)
 | |
| define void @foo(%B* %pb$, %R* %pr$) nounwind {
 | |
| L.0:
 | |
| 	%pb = alloca %B*
 | |
| 	%pr = alloca %R*
 | |
| 	store %B* %pb$, %B** %pb
 | |
| 	store %R* %pr$, %R** %pr
 | |
| 	%pe = alloca %E*
 | |
| 	%0 = load %B*, %B** %pb
 | |
| 	%1 = bitcast %B* %0 to %E*
 | |
| 	store %E* %1, %E** %pe
 | |
| 	%2 = load %R*, %R** %pr
 | |
| 	%3 = getelementptr %R, %R* %2, i32 0, i32 0
 | |
| 	%4 = load i32, i32* %3
 | |
| 	switch i32 %4, label %L.1 [
 | |
| 		i32 1, label %L.3
 | |
| 	]
 | |
| L.3:
 | |
| 	%px = alloca %X*
 | |
| 	%5 = load %R*, %R** %pr
 | |
| 	%6 = bitcast %R* %5 to %X*
 | |
| 	store %X* %6, %X** %px
 | |
| 	%7 = load %X*, %X** %px
 | |
| 	%8 = getelementptr %X, %X* %7, i32 0, i32 0
 | |
| 	%9 = load i32, i32* %8
 | |
| 	%10 = icmp ne i32 %9, 0
 | |
| 	br i1 %10, label %L.5, label %L.4
 | |
| L.5:
 | |
| 	%pu = alloca %U*
 | |
| 	%11 = call [0 x i8]* @memalloc(i32 8, i32 4, i32 0)
 | |
| 	%12 = bitcast [0 x i8]* %11 to %U*
 | |
| 	store %U* %12, %U** %pu
 | |
| 	%13 = load %X*, %X** %px
 | |
| 	%14 = getelementptr %X, %X* %13, i32 0, i32 1
 | |
| 	%15 = load i8, i8* %14
 | |
| 	%16 = load %U*, %U** %pu
 | |
| 	%17 = getelementptr %U, %U* %16, i32 0, i32 1
 | |
| 	store i8 %15, i8* %17
 | |
| 	%18 = load %E*, %E** %pe
 | |
| 	%19 = getelementptr %E, %E* %18, i32 0, i32 1
 | |
| 	%20 = load %U*, %U** %19
 | |
| 	%21 = load %U*, %U** %pu
 | |
| 	%22 = getelementptr %U, %U* %21, i32 0, i32 0
 | |
| 	store %U* %20, %U** %22
 | |
| 	%23 = load %U*, %U** %pu
 | |
| 	%24 = load %E*, %E** %pe
 | |
| 	%25 = getelementptr %E, %E* %24, i32 0, i32 1
 | |
| 	store %U* %23, %U** %25
 | |
| 	br label %L.4
 | |
| L.4:
 | |
| 	%26 = load %X*, %X** %px
 | |
| 	%27 = bitcast %X* %26 to [0 x i8]*
 | |
| 	call void @memfree([0 x i8]* %27, i32 8, i32 0)
 | |
| 	br label %L.2
 | |
| L.1:
 | |
| 	br label %L.2
 | |
| L.2:
 | |
| 	br label %return
 | |
| return:
 | |
| 	ret void
 | |
| }
 |