[WinEH] Emit state stores for SEH scopes (#116546)
[llvm-project.git] / llvm / test / Transforms / CodeGenPrepare / ARM / large-offset-gep.ll
blobad2dff17ce2fb9b18d5032e996bfb02fab4aea20
1 ; RUN: llc -mtriple=armv6m-linux-gnueabi -verify-machineinstrs -o - %s -disable-constant-hoisting | FileCheck %s
3 %struct_type = type { [10000 x i32], i32, i32 }
5 define void @test1(ptr %s, i32 %n) {
6 ; CHECK-LABEL: test1
7 entry:
8   %struct = load ptr, ptr %s
9   br label %while_cond
11 while_cond:
12   %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
13   %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
14   %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
15   %cmp = icmp slt i32 %phi, %n
16   br i1 %cmp, label %while_body, label %while_end
18 while_body:
19 ; CHECK:      str      r{{[0-9]+}}, [r{{[0-9]+}}]
20 ; CHECK-NEXT: str      r{{[0-9]+}}, [r{{[0-9]+}}, #4]
21   %i = add i32 %phi, 1
22   store i32 %i, ptr %gep0
23   store i32 %phi, ptr %gep1
24   br label %while_cond
26 while_end:
27   ret void
28 ; CHECK: .LCPI0_0:
29 ; CHECK-NEXT: .long   40000
30 ; CHECK-NOT: LCPI0
33 define void @test2(ptr %struct, i32 %n) {
34 ; CHECK-LABEL: test2
35 entry:
36   %cmp = icmp eq ptr %struct, null
37   br i1 %cmp, label %while_end, label %while_cond
39 while_cond:
40   %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
41   %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
42   %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
43   %cmp1 = icmp slt i32 %phi, %n
44   br i1 %cmp1, label %while_body, label %while_end
46 while_body:
47 ; CHECK:      str      r{{[0-9]+}}, [r{{[0-9]+}}]
48 ; CHECK-NEXT: str      r{{[0-9]+}}, [r{{[0-9]+}}, #4]
49   %i = add i32 %phi, 1
50   store i32 %i, ptr %gep0
51   store i32 %phi, ptr %gep1
52   br label %while_cond
54 while_end:
55   ret void
56 ; CHECK: .LCPI1_0:
57 ; CHECK-NEXT: .long   40000
58 ; CHECK-NOT: LCPI1
61 define void @test3(ptr %s1, ptr %s2, i1 %cond, i32 %n) {
62 ; CHECK-LABEL: test3
63 entry:
64   br i1 %cond, label %if_true, label %if_end
66 if_true:
67   br label %if_end
69 if_end:
70   %struct = phi ptr [ %s1, %entry ], [ %s2, %if_true ]
71   %cmp = icmp eq ptr %struct, null
72   br i1 %cmp, label %while_end, label %while_cond
74 while_cond:
75   %phi = phi i32 [ 0, %if_end ], [ %i, %while_body ]
76   %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
77   %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
78   %cmp1 = icmp slt i32 %phi, %n
79   br i1 %cmp1, label %while_body, label %while_end
81 while_body:
82 ; CHECK:      str      r{{[0-9]+}}, [r{{[0-9]+}}]
83 ; CHECK-NEXT: str      r{{[0-9]+}}, [r{{[0-9]+}}, #4]
84   %i = add i32 %phi, 1
85   store i32 %i, ptr %gep0
86   store i32 %phi, ptr %gep1
87   br label %while_cond
89 while_end:
90   ret void
91 ; CHECK: .LCPI2_0:
92 ; CHECK-NEXT: .long   40000
93 ; CHECK-NOT: LCPI2
96 declare ptr @foo()
98 define void @test4(i32 %n) personality ptr @__FrameHandler {
99 ; CHECK-LABEL: test4
100 entry:
101   %struct = invoke ptr @foo() to label %while_cond unwind label %cleanup
103 while_cond:
104   %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
105   %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
106   %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
107   %cmp = icmp slt i32 %phi, %n
108   br i1 %cmp, label %while_body, label %while_end
110 while_body:
111 ; CHECK:      str      r{{[0-9]+}}, [r{{[0-9]+}}]
112 ; CHECK-NEXT: str      r{{[0-9]+}}, [r{{[0-9]+}}, #4]
113   %i = add i32 %phi, 1
114   store i32 %i, ptr %gep0
115   store i32 %phi, ptr %gep1
116   br label %while_cond
118 while_end:
119   ret void
121 cleanup:
122   landingpad { ptr, i32 } cleanup
123   unreachable
124 ; CHECK: .LCPI3_0:
125 ; CHECK-NEXT: .long   40000
126 ; CHECK-NOT: LCPI3
129 declare i32 @__FrameHandler(...)
131 define void @test5(ptr %s, i32 %n) {
132 ; CHECK-LABEL: test5
133 entry:
134   %struct = load ptr, ptr %s
135   br label %while_cond
137 while_cond:
138   %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
139   %gep0 = getelementptr [65536 x i32], ptr %struct, i64 0, i32 20000
140   %gep1 = getelementptr [65536 x i32], ptr %struct, i64 0, i32 20001
141   %cmp = icmp slt i32 %phi, %n
142   br i1 %cmp, label %while_body, label %while_end
144 while_body:
145 ; CHECK:      str      r{{[0-9]+}}, [r{{[0-9]+}}]
146 ; CHECK-NEXT: str      r{{[0-9]+}}, [r{{[0-9]+}}, #4]
147   %i = add i32 %phi, 1
148   store i32 %i, ptr %gep0
149   store i32 %phi, ptr %gep1
150   br label %while_cond
152 while_end:
153   ret void
154 ; CHECK: .LCPI4_0:
155 ; CHECK-NEXT: .long   80000
156 ; CHECK-NOT: LCPI4