1; ARM EHABI integrated test 2 3; This test case checks whether the ARM DWARF stack frame directives 4; are properly generated or not. 5 6; We have to check several cases: 7; (1) arm with -disable-fp-elim 8; (2) arm without -disable-fp-elim 9; (3) armv7 with -disable-fp-elim 10; (4) armv7 without -disable-fp-elim 11; (5) thumb with -disable-fp-elim 12; (6) thumb without -disable-fp-elim 13; (7) thumbv7 with -disable-fp-elim 14; (8) thumbv7 without -disable-fp-elim 15; (9) thumbv7 with -no-integrated-as 16 17; RUN: llc -mtriple arm-unknown-linux-gnueabi \ 18; RUN: -disable-fp-elim -filetype=asm -o - %s \ 19; RUN: | FileCheck %s --check-prefix=CHECK-FP 20 21; RUN: llc -mtriple arm-unknown-linux-gnueabi \ 22; RUN: -filetype=asm -o - %s \ 23; RUN: | FileCheck %s --check-prefix=CHECK-FP-ELIM 24 25; RUN: llc -mtriple armv7-unknown-linux-gnueabi \ 26; RUN: -disable-fp-elim -filetype=asm -o - %s \ 27; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP 28 29; RUN: llc -mtriple armv7-unknown-linux-gnueabi \ 30; RUN: -filetype=asm -o - %s \ 31; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM 32 33; RUN: llc -mtriple thumb-unknown-linux-gnueabi \ 34; RUN: -disable-fp-elim -filetype=asm -o - %s \ 35; RUN: | FileCheck %s --check-prefix=CHECK-THUMB-FP 36 37; RUN: llc -mtriple thumb-unknown-linux-gnueabi \ 38; RUN: -filetype=asm -o - %s \ 39; RUN: | FileCheck %s --check-prefix=CHECK-THUMB-FP-ELIM 40 41; RUN: llc -mtriple thumbv7-unknown-linux-gnueabi \ 42; RUN: -disable-fp-elim -filetype=asm -o - %s \ 43; RUN: | FileCheck %s --check-prefix=CHECK-THUMB-V7-FP 44 45; RUN: llc -mtriple thumbv7-unknown-linux-gnueabi \ 46; RUN: -filetype=asm -o - %s \ 47; RUN: | FileCheck %s --check-prefix=CHECK-THUMB-V7-FP-ELIM 48 49; RUN: llc -mtriple thumbv7-unknown-linux-gnueabi \ 50; RUN: -disable-fp-elim -no-integrated-as -filetype=asm -o - %s \ 51; RUN: | FileCheck %s --check-prefix=CHECK-THUMB-V7-FP-NOIAS 52 53;------------------------------------------------------------------------------- 54; Test 1 55;------------------------------------------------------------------------------- 56; This is the LLVM assembly generated from following C++ code: 57; 58; extern void print(int, int, int, int, int); 59; extern void print(double, double, double, double, double); 60; 61; void test(int a, int b, int c, int d, int e, 62; double m, double n, double p, double q, double r) { 63; try { 64; print(a, b, c, d, e); 65; } catch (...) { 66; print(m, n, p, q, r); 67; } 68; } 69 70declare void @_Z5printiiiii(i32, i32, i32, i32, i32) 71 72declare void @_Z5printddddd(double, double, double, double, double) 73 74define void @_Z4testiiiiiddddd(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, 75 double %m, double %n, double %p, 76 double %q, double %r) { 77entry: 78 invoke void @_Z5printiiiii(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) 79 to label %try.cont unwind label %lpad 80 81lpad: 82 %0 = landingpad { i8*, i32 } 83 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) 84 catch i8* null 85 %1 = extractvalue { i8*, i32 } %0, 0 86 %2 = tail call i8* @__cxa_begin_catch(i8* %1) 87 invoke void @_Z5printddddd(double %m, double %n, double %p, 88 double %q, double %r) 89 to label %invoke.cont2 unwind label %lpad1 90 91invoke.cont2: 92 tail call void @__cxa_end_catch() 93 br label %try.cont 94 95try.cont: 96 ret void 97 98lpad1: 99 %3 = landingpad { i8*, i32 } 100 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) 101 cleanup 102 invoke void @__cxa_end_catch() 103 to label %eh.resume unwind label %terminate.lpad 104 105eh.resume: 106 resume { i8*, i32 } %3 107 108terminate.lpad: 109 %4 = landingpad { i8*, i32 } 110 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) 111 catch i8* null 112 %5 = extractvalue { i8*, i32 } %4, 0 113 tail call void @__clang_call_terminate(i8* %5) 114 unreachable 115} 116 117declare void @__clang_call_terminate(i8*) 118 119declare i32 @__gxx_personality_v0(...) 120 121declare i8* @__cxa_begin_catch(i8*) 122 123declare void @__cxa_end_catch() 124 125declare void @_ZSt9terminatev() 126 127!llvm.dbg.cu = !{!0} 128!llvm.module.flags = !{!10, !11} 129!llvm.ident = !{!12} 130 131!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/exp.cpp] [DW_LANG_C_plus_plus] 132!1 = metadata !{metadata !"exp.cpp", metadata !"/tmp"} 133!2 = metadata !{} 134!3 = metadata !{metadata !4} 135!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"test", metadata !"test", metadata !"_Z4testiiiiiddddd", i32 4, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32, i32, i32, i32, i32, double, double, double, double, double)* @_Z4testiiiiiddddd, null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 4] [def] [scope 5] [test] 136!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/exp.cpp] 137!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] 138!7 = metadata !{null, metadata !8, metadata !8, metadata !8, metadata !8, metadata !8, metadata !9, metadata !9, metadata !9, metadata !9, metadata !9} 139!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] 140!9 = metadata !{i32 786468, null, null, metadata !"double", i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] [double] [line 0, size 64, align 64, offset 0, enc DW_ATE_float] 141!10 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} 142!11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} 143!12 = metadata !{metadata !"clang version 3.5 "} 144!13 = metadata !{i32 786689, metadata !4, metadata !"a", metadata !5, i32 16777220, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a] [line 4] 145!14 = metadata !{i32 4, i32 0, metadata !4, null} 146!15 = metadata !{i32 786689, metadata !4, metadata !"b", metadata !5, i32 33554436, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 4] 147!16 = metadata !{i32 786689, metadata !4, metadata !"c", metadata !5, i32 50331652, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [c] [line 4] 148!17 = metadata !{i32 786689, metadata !4, metadata !"d", metadata !5, i32 67108868, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [d] [line 4] 149!18 = metadata !{i32 786689, metadata !4, metadata !"e", metadata !5, i32 83886084, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [e] [line 4] 150!19 = metadata !{i32 786689, metadata !4, metadata !"m", metadata !5, i32 100663301, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [m] [line 5] 151!20 = metadata !{i32 5, i32 0, metadata !4, null} 152!21 = metadata !{i32 786689, metadata !4, metadata !"n", metadata !5, i32 117440517, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [n] [line 5] 153!22 = metadata !{i32 786689, metadata !4, metadata !"p", metadata !5, i32 134217733, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [p] [line 5] 154!23 = metadata !{i32 786689, metadata !4, metadata !"q", metadata !5, i32 150994949, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [q] [line 5] 155!24 = metadata !{i32 786689, metadata !4, metadata !"r", metadata !5, i32 167772165, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [r] [line 5] 156!25 = metadata !{i32 7, i32 0, metadata !26, null} 157!26 = metadata !{i32 786443, metadata !1, metadata !4, i32 6, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/tmp/exp.cpp] 158!27 = metadata !{i32 8, i32 0, metadata !26, null} ; [ DW_TAG_imported_declaration ] 159!28 = metadata !{i32 11, i32 0, metadata !26, null} 160!29 = metadata !{i32 9, i32 0, metadata !30, null} 161!30 = metadata !{i32 786443, metadata !1, metadata !4, i32 8, i32 0, i32 1} ; [ DW_TAG_lexical_block ] [/tmp/exp.cpp] 162!31 = metadata !{i32 10, i32 0, metadata !30, null} 163!32 = metadata !{i32 10, i32 0, metadata !4, null} 164!33 = metadata !{i32 11, i32 0, metadata !4, null} 165!34 = metadata !{i32 11, i32 0, metadata !30, null} 166 167; CHECK-FP-LABEL: _Z4testiiiiiddddd: 168; CHECK-FP: .cfi_startproc 169; CHECK-FP: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} 170; CHECK-FP: .cfi_def_cfa_offset 36 171; CHECK-FP: .cfi_offset lr, -4 172; CHECK-FP: .cfi_offset r11, -8 173; CHECK-FP: .cfi_offset r10, -12 174; CHECK-FP: .cfi_offset r9, -16 175; CHECK-FP: .cfi_offset r8, -20 176; CHECK-FP: .cfi_offset r7, -24 177; CHECK-FP: .cfi_offset r6, -28 178; CHECK-FP: .cfi_offset r5, -32 179; CHECK-FP: .cfi_offset r4, -36 180; CHECK-FP: add r11, sp, #28 181; CHECK-FP: .cfi_def_cfa r11, 8 182; CHECK-FP: sub sp, sp, #28 183; CHECK-FP: .cfi_endproc 184 185; CHECK-FP-ELIM-LABEL: _Z4testiiiiiddddd: 186; CHECK-FP-ELIM: .cfi_startproc 187; CHECK-FP-ELIM: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} 188; CHECK-FP-ELIM: .cfi_def_cfa_offset 36 189; CHECK-FP-ELIM: .cfi_offset lr, -4 190; CHECK-FP-ELIM: .cfi_offset r11, -8 191; CHECK-FP-ELIM: .cfi_offset r10, -12 192; CHECK-FP-ELIM: .cfi_offset r9, -16 193; CHECK-FP-ELIM: .cfi_offset r8, -20 194; CHECK-FP-ELIM: .cfi_offset r7, -24 195; CHECK-FP-ELIM: .cfi_offset r6, -28 196; CHECK-FP-ELIM: .cfi_offset r5, -32 197; CHECK-FP-ELIM: .cfi_offset r4, -36 198; CHECK-FP-ELIM: sub sp, sp, #28 199; CHECK-FP-ELIM: .cfi_def_cfa_offset 64 200; CHECK-FP-ELIM: .cfi_endproc 201 202; CHECK-V7-FP-LABEL: _Z4testiiiiiddddd: 203; CHECK-V7-FP: .cfi_startproc 204; CHECK-V7-FP: push {r4, r11, lr} 205; CHECK-V7-FP: .cfi_def_cfa_offset 12 206; CHECK-V7-FP: .cfi_offset lr, -4 207; CHECK-V7-FP: .cfi_offset r11, -8 208; CHECK-V7-FP: .cfi_offset r4, -12 209; CHECK-V7-FP: add r11, sp, #4 210; CHECK-V7-FP: .cfi_def_cfa r11, 8 211; CHECK-V7-FP: vpush {d8, d9, d10, d11, d12} 212; CHECK-V7-FP: .cfi_offset d12, -24 213; CHECK-V7-FP: .cfi_offset d11, -32 214; CHECK-V7-FP: .cfi_offset d10, -40 215; CHECK-V7-FP: .cfi_offset d9, -48 216; CHECK-V7-FP: .cfi_offset d8, -56 217; CHECK-V7-FP: sub sp, sp, #28 218; CHECK-V7-FP: .cfi_endproc 219 220; CHECK-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd: 221; CHECK-V7-FP-ELIM: .cfi_startproc 222; CHECK-V7-FP-ELIM: push {r4, lr} 223; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 8 224; CHECK-V7-FP-ELIM: .cfi_offset lr, -4 225; CHECK-V7-FP-ELIM: .cfi_offset r4, -8 226; CHECK-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12} 227; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 48 228; CHECK-V7-FP-ELIM: .cfi_offset d12, -16 229; CHECK-V7-FP-ELIM: .cfi_offset d11, -24 230; CHECK-V7-FP-ELIM: .cfi_offset d10, -32 231; CHECK-V7-FP-ELIM: .cfi_offset d9, -40 232; CHECK-V7-FP-ELIM: .cfi_offset d8, -48 233; CHECK-V7-FP-ELIM: sub sp, sp, #24 234; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 72 235; CHECK-V7-FP-ELIM: .cfi_endproc 236 237; CHECK-THUMB-FP-LABEL: _Z4testiiiiiddddd: 238; CHECK-THUMB-FP: .cfi_startproc 239; CHECK-THUMB-FP: push {r4, r5, r6, r7, lr} 240; CHECK-THUMB-FP: .cfi_def_cfa_offset 20 241; CHECK-THUMB-FP: .cfi_offset lr, -4 242; CHECK-THUMB-FP: .cfi_offset r7, -8 243; CHECK-THUMB-FP: .cfi_offset r6, -12 244; CHECK-THUMB-FP: .cfi_offset r5, -16 245; CHECK-THUMB-FP: .cfi_offset r4, -20 246; CHECK-THUMB-FP: add r7, sp, #12 247; CHECK-THUMB-FP: .cfi_def_cfa r7, 8 248; CHECK-THUMB-FP: sub sp, #60 249; CHECK-THUMB-FP: .cfi_endproc 250 251; CHECK-THUMB-FP-ELIM-LABEL: _Z4testiiiiiddddd: 252; CHECK-THUMB-FP-ELIM: .cfi_startproc 253; CHECK-THUMB-FP-ELIM: push {r4, r5, r6, r7, lr} 254; CHECK-THUMB-FP-ELIM: .cfi_def_cfa_offset 20 255; CHECK-THUMB-FP-ELIM: .cfi_offset lr, -4 256; CHECK-THUMB-FP-ELIM: .cfi_offset r7, -8 257; CHECK-THUMB-FP-ELIM: .cfi_offset r6, -12 258; CHECK-THUMB-FP-ELIM: .cfi_offset r5, -16 259; CHECK-THUMB-FP-ELIM: .cfi_offset r4, -20 260; CHECK-THUMB-FP-ELIM: sub sp, #60 261; CHECK-THUMB-FP-ELIM: .cfi_def_cfa_offset 80 262; CHECK-THUMB-FP-ELIM: .cfi_endproc 263 264; CHECK-THUMB-V7-FP-LABEL: _Z4testiiiiiddddd: 265; CHECK-THUMB-V7-FP: .cfi_startproc 266; CHECK-THUMB-V7-FP: push.w {r4, r7, r11, lr} 267; CHECK-THUMB-V7-FP: .cfi_def_cfa_offset 16 268; CHECK-THUMB-V7-FP: .cfi_offset lr, -4 269; CHECK-THUMB-V7-FP: .cfi_offset r11, -8 270; CHECK-THUMB-V7-FP: .cfi_offset r7, -12 271; CHECK-THUMB-V7-FP: .cfi_offset r4, -16 272; CHECK-THUMB-V7-FP: add r7, sp, #4 273; CHECK-THUMB-V7-FP: .cfi_def_cfa r7, 12 274; CHECK-THUMB-V7-FP: vpush {d8, d9, d10, d11, d12} 275; CHECK-THUMB-V7-FP: .cfi_offset d12, -24 276; CHECK-THUMB-V7-FP: .cfi_offset d11, -32 277; CHECK-THUMB-V7-FP: .cfi_offset d10, -40 278; CHECK-THUMB-V7-FP: .cfi_offset d9, -48 279; CHECK-THUMB-V7-FP: .cfi_offset d8, -56 280; CHECK-THUMB-V7-FP: sub sp, #24 281; CHECK-THUMB-V7-FP: .cfi_endproc 282 283; CHECK-THUMB-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd: 284; CHECK-THUMB-V7-FP-ELIM: .cfi_startproc 285; CHECK-THUMB-V7-FP-ELIM: push {r4, lr} 286; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 8 287; CHECK-THUMB-V7-FP-ELIM: .cfi_offset lr, -4 288; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r4, -8 289; CHECK-THUMB-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12} 290; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 48 291; CHECK-THUMB-V7-FP-ELIM: .cfi_offset d12, -16 292; CHECK-THUMB-V7-FP-ELIM: .cfi_offset d11, -24 293; CHECK-THUMB-V7-FP-ELIM: .cfi_offset d10, -32 294; CHECK-THUMB-V7-FP-ELIM: .cfi_offset d9, -40 295; CHECK-THUMB-V7-FP-ELIM: .cfi_offset d8, -48 296; CHECK-THUMB-V7-FP-ELIM: sub sp, #24 297; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 72 298; CHECK-THUMB-V7-FP-ELIM: .cfi_endproc 299 300; CHECK-THUMB-V7-FP-NOIAS-LABEL: _Z4testiiiiiddddd: 301; CHECK-THUMB-V7-FP-NOIAS: .cfi_startproc 302; CHECK-THUMB-V7-FP-NOIAS: push.w {r4, r7, r11, lr} 303; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa_offset 16 304; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 14, -4 305; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 11, -8 306; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 7, -12 307; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 4, -16 308; CHECK-THUMB-V7-FP-NOIAS: add r7, sp, #4 309; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa 7, 12 310; CHECK-THUMB-V7-FP-NOIAS: vpush {d8, d9, d10, d11, d12} 311; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 268, -24 312; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 267, -32 313; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 266, -40 314; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 265, -48 315; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 264, -56 316; CHECK-THUMB-V7-FP-NOIAS: sub sp, #24 317; CHECK-THUMB-V7-FP-NOIAS: .cfi_endproc 318 319;------------------------------------------------------------------------------- 320; Test 2 321;------------------------------------------------------------------------------- 322 323declare void @throw_exception_2() 324 325define void @test2() { 326entry: 327 call void @throw_exception_2() 328 ret void 329} 330 331; CHECK-FP-LABEL: test2: 332; CHECK-FP: .cfi_startproc 333; CHECK-FP: push {r11, lr} 334; CHECK-FP: .cfi_def_cfa_offset 8 335; CHECK-FP: .cfi_offset lr, -4 336; CHECK-FP: .cfi_offset r11, -8 337; CHECK-FP: mov r11, sp 338; CHECK-FP: .cfi_def_cfa_register r11 339; CHECK-FP: pop {r11, lr} 340; CHECK-FP: mov pc, lr 341; CHECK-FP: .cfi_endproc 342 343; CHECK-FP-ELIM-LABEL: test2: 344; CHECK-FP-ELIM: .cfi_startproc 345; CHECK-FP-ELIM: push {r11, lr} 346; CHECK-FP-ELIM: .cfi_def_cfa_offset 8 347; CHECK-FP-ELIM: .cfi_offset lr, -4 348; CHECK-FP-ELIM: .cfi_offset r11, -8 349; CHECK-FP-ELIM: pop {r11, lr} 350; CHECK-FP-ELIM: mov pc, lr 351; CHECK-FP-ELIM: .cfi_endproc 352 353; CHECK-V7-FP-LABEL: test2: 354; CHECK-V7-FP: .cfi_startproc 355; CHECK-V7-FP: push {r11, lr} 356; CHECK-V7-FP: .cfi_def_cfa_offset 8 357; CHECK-V7-FP: .cfi_offset lr, -4 358; CHECK-V7-FP: .cfi_offset r11, -8 359; CHECK-V7-FP: mov r11, sp 360; CHECK-V7-FP: .cfi_def_cfa_register r11 361; CHECK-V7-FP: pop {r11, pc} 362; CHECK-V7-FP: .cfi_endproc 363 364; CHECK-V7-FP-ELIM-LABEL: test2: 365; CHECK-V7-FP-ELIM: .cfi_startproc 366; CHECK-V7-FP-ELIM: push {r11, lr} 367; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 8 368; CHECK-V7-FP-ELIM: .cfi_offset lr, -4 369; CHECK-V7-FP-ELIM: .cfi_offset r11, -8 370; CHECK-V7-FP-ELIM: pop {r11, pc} 371; CHECK-V7-FP-ELIM: .cfi_endproc 372 373; CHECK-THUMB-FP-LABEL: test2: 374; CHECK-THUMB-FP: .cfi_startproc 375; CHECK-THUMB-FP: push {r7, lr} 376; CHECK-THUMB-FP: .cfi_def_cfa_offset 8 377; CHECK-THUMB-FP: .cfi_offset lr, -4 378; CHECK-THUMB-FP: .cfi_offset r7, -8 379; CHECK-THUMB-FP: add r7, sp, #0 380; CHECK-THUMB-FP: .cfi_def_cfa_register r7 381; CHECK-THUMB-FP: pop {r7, pc} 382; CHECK-THUMB-FP: .cfi_endproc 383 384; CHECK-THUMB-FP-ELIM-LABEL: test2: 385; CHECK-THUMB-FP-ELIM: .cfi_startproc 386; CHECK-THUMB-FP-ELIM: push {r7, lr} 387; CHECK-THUMB-FP-ELIM: .cfi_def_cfa_offset 8 388; CHECK-THUMB-FP-ELIM: .cfi_offset lr, -4 389; CHECK-THUMB-FP-ELIM: .cfi_offset r7, -8 390; CHECK-THUMB-FP-ELIM: pop {r7, pc} 391; CHECK-THUMB-FP-ELIM: .cfi_endproc 392 393; CHECK-THUMB-V7-FP-LABEL: test2: 394; CHECK-THUMB-V7-FP: .cfi_startproc 395; CHECK-THUMB-V7-FP: push {r7, lr} 396; CHECK-THUMB-V7-FP: .cfi_def_cfa_offset 8 397; CHECK-THUMB-V7-FP: .cfi_offset lr, -4 398; CHECK-THUMB-V7-FP: .cfi_offset r7, -8 399; CHECK-THUMB-V7-FP: mov r7, sp 400; CHECK-THUMB-V7-FP: .cfi_def_cfa_register r7 401; CHECK-THUMB-V7-FP: pop {r7, pc} 402; CHECK-THUMB-V7-FP: .cfi_endproc 403 404; CHECK-THUMB-V7-FP-ELIM-LABEL: test2: 405; CHECK-THUMB-V7-FP-ELIM: .cfi_startproc 406; CHECK-THUMB-V7-FP-ELIM: push.w {r11, lr} 407; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 8 408; CHECK-THUMB-V7-FP-ELIM: .cfi_offset lr, -4 409; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r11, -8 410; CHECK-THUMB-V7-FP-ELIM: pop.w {r11, pc} 411; CHECK-THUMB-V7-FP-ELIM: .cfi_endproc 412 413 414;------------------------------------------------------------------------------- 415; Test 3 416;------------------------------------------------------------------------------- 417 418declare void @throw_exception_3(i32) 419 420define i32 @test3(i32 %a, i32 %b, i32 %c, i32 %d, 421 i32 %e, i32 %f, i32 %g, i32 %h) { 422entry: 423 %add = add nsw i32 %b, %a 424 %add1 = add nsw i32 %add, %c 425 %add2 = add nsw i32 %add1, %d 426 tail call void @throw_exception_3(i32 %add2) 427 %add3 = add nsw i32 %f, %e 428 %add4 = add nsw i32 %add3, %g 429 %add5 = add nsw i32 %add4, %h 430 tail call void @throw_exception_3(i32 %add5) 431 %add6 = add nsw i32 %add5, %add2 432 ret i32 %add6 433} 434 435; CHECK-FP-LABEL: test3: 436; CHECK-FP: .cfi_startproc 437; CHECK-FP: push {r4, r5, r11, lr} 438; CHECK-FP: .cfi_def_cfa_offset 16 439; CHECK-FP: .cfi_offset lr, -4 440; CHECK-FP: .cfi_offset r11, -8 441; CHECK-FP: .cfi_offset r5, -12 442; CHECK-FP: .cfi_offset r4, -16 443; CHECK-FP: add r11, sp, #8 444; CHECK-FP: .cfi_def_cfa r11, 8 445; CHECK-FP: pop {r4, r5, r11, lr} 446; CHECK-FP: mov pc, lr 447; CHECK-FP: .cfi_endproc 448 449; CHECK-FP-ELIM-LABEL: test3: 450; CHECK-FP-ELIM: .cfi_startproc 451; CHECK-FP-ELIM: push {r4, r5, r11, lr} 452; CHECK-FP-ELIM: .cfi_def_cfa_offset 16 453; CHECK-FP-ELIM: .cfi_offset lr, -4 454; CHECK-FP-ELIM: .cfi_offset r11, -8 455; CHECK-FP-ELIM: .cfi_offset r5, -12 456; CHECK-FP-ELIM: .cfi_offset r4, -16 457; CHECK-FP-ELIM: pop {r4, r5, r11, lr} 458; CHECK-FP-ELIM: mov pc, lr 459; CHECK-FP-ELIM: .cfi_endproc 460 461; CHECK-V7-FP-LABEL: test3: 462; CHECK-V7-FP: .cfi_startproc 463; CHECK-V7-FP: push {r4, r5, r11, lr} 464; CHECK-V7-FP: .cfi_def_cfa_offset 16 465; CHECK-V7-FP: .cfi_offset lr, -4 466; CHECK-V7-FP: .cfi_offset r11, -8 467; CHECK-V7-FP: .cfi_offset r5, -12 468; CHECK-V7-FP: .cfi_offset r4, -16 469; CHECK-V7-FP: add r11, sp, #8 470; CHECK-V7-FP: .cfi_def_cfa r11, 8 471; CHECK-V7-FP: pop {r4, r5, r11, pc} 472; CHECK-V7-FP: .cfi_endproc 473 474; CHECK-V7-FP-ELIM-LABEL: test3: 475; CHECK-V7-FP-ELIM: .cfi_startproc 476; CHECK-V7-FP-ELIM: push {r4, r5, r11, lr} 477; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 16 478; CHECK-V7-FP-ELIM: .cfi_offset lr, -4 479; CHECK-V7-FP-ELIM: .cfi_offset r11, -8 480; CHECK-V7-FP-ELIM: .cfi_offset r5, -12 481; CHECK-V7-FP-ELIM: .cfi_offset r4, -16 482; CHECK-V7-FP-ELIM: pop {r4, r5, r11, pc} 483; CHECK-V7-FP-ELIM: .cfi_endproc 484 485; CHECK-THUMB-FP-LABEL: test3: 486; CHECK-THUMB-FP: .cfi_startproc 487; CHECK-THUMB-FP: push {r4, r5, r7, lr} 488; CHECK-THUMB-FP: .cfi_def_cfa_offset 16 489; CHECK-THUMB-FP: .cfi_offset lr, -4 490; CHECK-THUMB-FP: .cfi_offset r7, -8 491; CHECK-THUMB-FP: .cfi_offset r5, -12 492; CHECK-THUMB-FP: .cfi_offset r4, -16 493; CHECK-THUMB-FP: add r7, sp, #8 494; CHECK-THUMB-FP: .cfi_def_cfa r7, 8 495; CHECK-THUMB-FP: pop {r4, r5, r7, pc} 496; CHECK-THUMB-FP: .cfi_endproc 497 498; CHECK-THUMB-FP-ELIM-LABEL: test3: 499; CHECK-THUMB-FP-ELIM: .cfi_startproc 500; CHECK-THUMB-FP-ELIM: push {r4, r5, r7, lr} 501; CHECK-THUMB-FP-ELIM: .cfi_def_cfa_offset 16 502; CHECK-THUMB-FP-ELIM: .cfi_offset lr, -4 503; CHECK-THUMB-FP-ELIM: .cfi_offset r7, -8 504; CHECK-THUMB-FP-ELIM: .cfi_offset r5, -12 505; CHECK-THUMB-FP-ELIM: .cfi_offset r4, -16 506; CHECK-THUMB-FP-ELIM: pop {r4, r5, r7, pc} 507; CHECK-THUMB-FP-ELIM: .cfi_endproc 508 509; CHECK-THUMB-V7-FP-LABEL: test3: 510; CHECK-THUMB-V7-FP: .cfi_startproc 511; CHECK-THUMB-V7-FP: push {r4, r5, r7, lr} 512; CHECK-THUMB-V7-FP: .cfi_def_cfa_offset 16 513; CHECK-THUMB-V7-FP: .cfi_offset lr, -4 514; CHECK-THUMB-V7-FP: .cfi_offset r7, -8 515; CHECK-THUMB-V7-FP: .cfi_offset r5, -12 516; CHECK-THUMB-V7-FP: .cfi_offset r4, -16 517; CHECK-THUMB-V7-FP: add r7, sp, #8 518; CHECK-THUMB-V7-FP: .cfi_def_cfa r7, 8 519; CHECK-THUMB-V7-FP: pop {r4, r5, r7, pc} 520; CHECK-THUMB-V7-FP: .cfi_endproc 521 522; CHECK-THUMB-V7-FP-ELIM-LABEL: test3: 523; CHECK-THUMB-V7-FP-ELIM: .cfi_startproc 524; CHECK-THUMB-V7-FP-ELIM: push.w {r4, r5, r11, lr} 525; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 16 526; CHECK-THUMB-V7-FP-ELIM: .cfi_offset lr, -4 527; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r11, -8 528; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r5, -12 529; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r4, -16 530; CHECK-THUMB-V7-FP-ELIM: pop.w {r4, r5, r11, pc} 531; CHECK-THUMB-V7-FP-ELIM: .cfi_endproc 532 533 534;------------------------------------------------------------------------------- 535; Test 4 536;------------------------------------------------------------------------------- 537 538define void @test4() nounwind { 539entry: 540 ret void 541} 542 543; CHECK-FP-LABEL: test4: 544; CHECK-FP: mov pc, lr 545; CHECK-FP-NOT: .cfi_def_cfa_offset 546 547; CHECK-FP-ELIM-LABEL: test4: 548; CHECK-FP-ELIM: mov pc, lr 549; CHECK-FP-ELIM-NOT: .cfi_def_cfa_offset 550 551; CHECK-V7-FP-LABEL: test4: 552; CHECK-V7-FP: bx lr 553; CHECK-V7-FP-NOT: .cfi_def_cfa_offset 554 555; CHECK-V7-FP-ELIM-LABEL: test4: 556; CHECK-V7-FP-ELIM: bx lr 557; CHECK-V7-FP-ELIM-NOT: .cfi_def_cfa_offset 558 559; CHECK-THUMB-FP-LABEL: test4: 560; CHECK-THUMB-FP: bx lr 561; CHECK-THUMB-FP-NOT: .cfi_def_cfa_offset 562 563; CHECK-THUMB-FP-ELIM-LABEL: test4: 564; CHECK-THUMB-FP-ELIM: bx lr 565; CHECK-THUMB-FP-ELIM-NOT: .cfi_def_cfa_offset 566 567; CHECK-THUMB-V7-FP-LABEL: test4: 568; CHECK-THUMB-V7-FP: bx lr 569; CHECK-THUMB-V7-FP-NOT: .cfi_def_cfa_offset 570 571; CHECK-THUMB-V7-FP-ELIM-LABEL: test4: 572; CHECK-THUMB-V7-FP-ELIM: bx lr 573; CHECK-THUMB-V7-FP-ELIM-NOT: .cfi_def_cfa_offset 574 575