[win/asan] GetInstructionSize: Fix `83 E4 XX` to return 3. (#119644)
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / bug-subw.ll
blob41d96116c67ac536f87cd159497dd694eaa67fb4
1 ; pr23772 - [ARM] r226200 can emit illegal thumb2 instruction: "sub sp, r12, #80"
2 ; RUN: llc -march=thumb -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
6 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32"
7 target 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}
13 declare external ptr @memalloc(i32, i32, i32)
14 declare external void @memfree(ptr, i32, i32)
15 define void @foo(ptr %pb$, ptr %pr$) nounwind {
16 L.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         ]
29 L.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
37 L.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
57 L.4:
58         %20 = load ptr, ptr %px
59         call void @memfree(ptr %20, i32 8, i32 0)
60         br label %L.2
61 L.1:
62         br label %L.2
63 L.2:
64         br label %return
65 return:
66         ret void