67 lines
1.8 KiB
LLVM
67 lines
1.8 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 {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
|
|
}
|