diff options
Diffstat (limited to 'llvm/test/CodeGen/Thumb2/bug-subw.ll')
| -rw-r--r-- | llvm/test/CodeGen/Thumb2/bug-subw.ll | 74 | 
1 files changed, 74 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Thumb2/bug-subw.ll b/llvm/test/CodeGen/Thumb2/bug-subw.ll new file mode 100644 index 00000000000..a9ca37e753b --- /dev/null +++ b/llvm/test/CodeGen/Thumb2/bug-subw.ll @@ -0,0 +1,74 @@ +; 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 +}  | 

