summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Thumb2/bug-subw.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/Thumb2/bug-subw.ll')
-rw-r--r--llvm/test/CodeGen/Thumb2/bug-subw.ll74
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
+}
OpenPOWER on IntegriCloud