|  | ; pr23772 - [ARM] r226200 can emit illegal thumb2 instruction: "sub sp, r12, #80" | 
|  | ; RUN: llc -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 {ptr} | 
|  | %R = type {i32} | 
|  | %U = type {ptr, i8, i8} | 
|  | %E = type {ptr, ptr} | 
|  | %X = type {i32, i8, i8} | 
|  | declare external ptr @memalloc(i32, i32, i32) | 
|  | declare external void @memfree(ptr, i32, i32) | 
|  | define void @foo(ptr %pb$, ptr %pr$) nounwind { | 
|  | L.0: | 
|  | %pb = alloca ptr | 
|  | %pr = alloca ptr | 
|  | store ptr %pb$, ptr %pb | 
|  | store ptr %pr$, ptr %pr | 
|  | %pe = alloca ptr | 
|  | %0 = load ptr, ptr %pb | 
|  | store ptr %0, ptr %pe | 
|  | %1 = load ptr, ptr %pr | 
|  | %2 = load i32, ptr %1 | 
|  | switch i32 %2, label %L.1 [ | 
|  | i32 1, label %L.3 | 
|  | ] | 
|  | L.3: | 
|  | %px = alloca ptr | 
|  | %3 = load ptr, ptr %pr | 
|  | store ptr %3, ptr %px | 
|  | %4 = load ptr, ptr %px | 
|  | %5 = load i32, ptr %4 | 
|  | %6 = icmp ne i32 %5, 0 | 
|  | br i1 %6, label %L.5, label %L.4 | 
|  | L.5: | 
|  | %pu = alloca ptr | 
|  | %7 = call ptr @memalloc(i32 8, i32 4, i32 0) | 
|  | store ptr %7, ptr %pu | 
|  | %8 = load ptr, ptr %px | 
|  | %9 = getelementptr %X, ptr %8, i32 0, i32 1 | 
|  | %10 = load i8, ptr %9 | 
|  | %11 = load ptr, ptr %pu | 
|  | %12 = getelementptr %U, ptr %11, i32 0, i32 1 | 
|  | store i8 %10, ptr %12 | 
|  | %13 = load ptr, ptr %pe | 
|  | %14 = getelementptr %E, ptr %13, i32 0, i32 1 | 
|  | %15 = load ptr, ptr %14 | 
|  | %16 = load ptr, ptr %pu | 
|  | store ptr %15, ptr %16 | 
|  | %17 = load ptr, ptr %pu | 
|  | %18 = load ptr, ptr %pe | 
|  | %19 = getelementptr %E, ptr %18, i32 0, i32 1 | 
|  | store ptr %17, ptr %19 | 
|  | br label %L.4 | 
|  | L.4: | 
|  | %20 = load ptr, ptr %px | 
|  | call void @memfree(ptr %20, i32 8, i32 0) | 
|  | br label %L.2 | 
|  | L.1: | 
|  | br label %L.2 | 
|  | L.2: | 
|  | br label %return | 
|  | return: | 
|  | ret void | 
|  | } |