1; pr23772 - [ARM] r226200 can emit illegal thumb2 instruction: "sub sp, r12, #80" 2; RUN: llc -mcpu=cortex-m3 -O3 -filetype=asm -o - %s | FileCheck %s 3; CHECK-NOT: sub{{.*}} sp, r{{.*}}, # 4; CHECK: .fnend 5; TODO: Missed optimization. The three instructions generated to subtract SP can be converged to a single one 6target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32" 7target triple = "thumbv7m-unknown-unknown" 8%B = type {ptr} 9%R = type {i32} 10%U = type {ptr, i8, i8} 11%E = type {ptr, ptr} 12%X = type {i32, i8, i8} 13declare external ptr @memalloc(i32, i32, i32) 14declare external void @memfree(ptr, i32, i32) 15define void @foo(ptr %pb$, ptr %pr$) nounwind { 16L.0: 17 %pb = alloca ptr 18 %pr = alloca ptr 19 store ptr %pb$, ptr %pb 20 store ptr %pr$, ptr %pr 21 %pe = alloca ptr 22 %0 = load ptr, ptr %pb 23 store ptr %0, ptr %pe 24 %1 = load ptr, ptr %pr 25 %2 = load i32, ptr %1 26 switch i32 %2, label %L.1 [ 27 i32 1, label %L.3 28 ] 29L.3: 30 %px = alloca ptr 31 %3 = load ptr, ptr %pr 32 store ptr %3, ptr %px 33 %4 = load ptr, ptr %px 34 %5 = load i32, ptr %4 35 %6 = icmp ne i32 %5, 0 36 br i1 %6, label %L.5, label %L.4 37L.5: 38 %pu = alloca ptr 39 %7 = call ptr @memalloc(i32 8, i32 4, i32 0) 40 store ptr %7, ptr %pu 41 %8 = load ptr, ptr %px 42 %9 = getelementptr %X, ptr %8, i32 0, i32 1 43 %10 = load i8, ptr %9 44 %11 = load ptr, ptr %pu 45 %12 = getelementptr %U, ptr %11, i32 0, i32 1 46 store i8 %10, ptr %12 47 %13 = load ptr, ptr %pe 48 %14 = getelementptr %E, ptr %13, i32 0, i32 1 49 %15 = load ptr, ptr %14 50 %16 = load ptr, ptr %pu 51 store ptr %15, ptr %16 52 %17 = load ptr, ptr %pu 53 %18 = load ptr, ptr %pe 54 %19 = getelementptr %E, ptr %18, i32 0, i32 1 55 store ptr %17, ptr %19 56 br label %L.4 57L.4: 58 %20 = load ptr, ptr %px 59 call void @memfree(ptr %20, i32 8, i32 0) 60 br label %L.2 61L.1: 62 br label %L.2 63L.2: 64 br label %return 65return: 66 ret void 67} 68