1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=none | FileCheck %s --check-prefix=R7 3; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=reserved | FileCheck %s --check-prefix=R7-RES 4; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=all | FileCheck %s --check-prefix=R7-ABI 5; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=none -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11 6; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=reserved -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11-RES 7; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=all -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11-ABI 8 9; int test1() { 10; return 0; 11; } 12define i32 @test1() "sign-return-address"="non-leaf" { 13; R7-LABEL: test1: 14; R7: .cfi_sections .debug_frame 15; R7-NEXT: .cfi_startproc 16; R7-NEXT: @ %bb.0: @ %entry 17; R7-NEXT: movs r0, #0 18; R7-NEXT: bx lr 19; 20; R7-RES-LABEL: test1: 21; R7-RES: .cfi_sections .debug_frame 22; R7-RES-NEXT: .cfi_startproc 23; R7-RES-NEXT: @ %bb.0: @ %entry 24; R7-RES-NEXT: movs r0, #0 25; R7-RES-NEXT: bx lr 26; 27; R7-ABI-LABEL: test1: 28; R7-ABI: .cfi_sections .debug_frame 29; R7-ABI-NEXT: .cfi_startproc 30; R7-ABI-NEXT: @ %bb.0: @ %entry 31; R7-ABI-NEXT: pac r12, lr, sp 32; R7-ABI-NEXT: .save {r7, lr} 33; R7-ABI-NEXT: push {r7, lr} 34; R7-ABI-NEXT: .cfi_def_cfa_offset 8 35; R7-ABI-NEXT: .cfi_offset lr, -4 36; R7-ABI-NEXT: .cfi_offset r7, -8 37; R7-ABI-NEXT: .setfp r7, sp 38; R7-ABI-NEXT: mov r7, sp 39; R7-ABI-NEXT: .cfi_def_cfa_register r7 40; R7-ABI-NEXT: .save {ra_auth_code} 41; R7-ABI-NEXT: str r12, [sp, #-4]! 42; R7-ABI-NEXT: .cfi_offset ra_auth_code, -12 43; R7-ABI-NEXT: movs r0, #0 44; R7-ABI-NEXT: ldr r12, [sp], #4 45; R7-ABI-NEXT: pop.w {r7, lr} 46; R7-ABI-NEXT: aut r12, lr, sp 47; R7-ABI-NEXT: bx lr 48; 49; R11-LABEL: test1: 50; R11: .cfi_sections .debug_frame 51; R11-NEXT: .cfi_startproc 52; R11-NEXT: @ %bb.0: @ %entry 53; R11-NEXT: movs r0, #0 54; R11-NEXT: bx lr 55; 56; R11-RES-LABEL: test1: 57; R11-RES: .cfi_sections .debug_frame 58; R11-RES-NEXT: .cfi_startproc 59; R11-RES-NEXT: @ %bb.0: @ %entry 60; R11-RES-NEXT: movs r0, #0 61; R11-RES-NEXT: bx lr 62; 63; R11-ABI-LABEL: test1: 64; R11-ABI: .cfi_sections .debug_frame 65; R11-ABI-NEXT: .cfi_startproc 66; R11-ABI-NEXT: @ %bb.0: @ %entry 67; R11-ABI-NEXT: pac r12, lr, sp 68; R11-ABI-NEXT: .save {ra_auth_code} 69; R11-ABI-NEXT: str r12, [sp, #-4]! 70; R11-ABI-NEXT: .cfi_def_cfa_offset 4 71; R11-ABI-NEXT: .cfi_offset ra_auth_code, -4 72; R11-ABI-NEXT: .save {r11, lr} 73; R11-ABI-NEXT: push.w {r11, lr} 74; R11-ABI-NEXT: .cfi_def_cfa_offset 12 75; R11-ABI-NEXT: .cfi_offset lr, -8 76; R11-ABI-NEXT: .cfi_offset r11, -12 77; R11-ABI-NEXT: .setfp r11, sp 78; R11-ABI-NEXT: mov r11, sp 79; R11-ABI-NEXT: .cfi_def_cfa_register r11 80; R11-ABI-NEXT: movs r0, #0 81; R11-ABI-NEXT: pop.w {r11, lr} 82; R11-ABI-NEXT: ldr r12, [sp], #4 83; R11-ABI-NEXT: aut r12, lr, sp 84; R11-ABI-NEXT: bx lr 85entry: 86 ret i32 0 87} 88 89; void foo(int n) { 90; int a[n]; 91; bar(a); 92; } 93define dso_local void @test2(i32 noundef %n) "sign-return-address"="non-leaf" { 94; R7-LABEL: test2: 95; R7: .cfi_startproc 96; R7-NEXT: @ %bb.0: @ %entry 97; R7-NEXT: pac r12, lr, sp 98; R7-NEXT: .save {r4, r6, r7, ra_auth_code, lr} 99; R7-NEXT: push.w {r4, r6, r7, r12, lr} 100; R7-NEXT: .cfi_def_cfa_offset 20 101; R7-NEXT: .cfi_offset lr, -4 102; R7-NEXT: .cfi_offset ra_auth_code, -8 103; R7-NEXT: .cfi_offset r7, -12 104; R7-NEXT: .cfi_offset r6, -16 105; R7-NEXT: .cfi_offset r4, -20 106; R7-NEXT: .setfp r7, sp, #8 107; R7-NEXT: add r7, sp, #8 108; R7-NEXT: .cfi_def_cfa r7, 12 109; R7-NEXT: .pad #4 110; R7-NEXT: sub sp, #4 111; R7-NEXT: movs r1, #7 112; R7-NEXT: add.w r0, r1, r0, lsl #2 113; R7-NEXT: bic r0, r0, #7 114; R7-NEXT: sub.w r0, sp, r0 115; R7-NEXT: mov sp, r0 116; R7-NEXT: bl take_ptr 117; R7-NEXT: sub.w r4, r7, #8 118; R7-NEXT: mov sp, r4 119; R7-NEXT: pop.w {r4, r6, r7, r12, lr} 120; R7-NEXT: aut r12, lr, sp 121; R7-NEXT: bx lr 122; 123; R7-RES-LABEL: test2: 124; R7-RES: .cfi_startproc 125; R7-RES-NEXT: @ %bb.0: @ %entry 126; R7-RES-NEXT: pac r12, lr, sp 127; R7-RES-NEXT: .save {r4, r6, r7, lr} 128; R7-RES-NEXT: push {r4, r6, r7, lr} 129; R7-RES-NEXT: .cfi_def_cfa_offset 16 130; R7-RES-NEXT: .cfi_offset lr, -4 131; R7-RES-NEXT: .cfi_offset r7, -8 132; R7-RES-NEXT: .cfi_offset r6, -12 133; R7-RES-NEXT: .cfi_offset r4, -16 134; R7-RES-NEXT: .setfp r7, sp, #8 135; R7-RES-NEXT: add r7, sp, #8 136; R7-RES-NEXT: .cfi_def_cfa r7, 8 137; R7-RES-NEXT: .save {ra_auth_code} 138; R7-RES-NEXT: str r12, [sp, #-4]! 139; R7-RES-NEXT: .cfi_offset ra_auth_code, -20 140; R7-RES-NEXT: .pad #4 141; R7-RES-NEXT: sub sp, #4 142; R7-RES-NEXT: movs r1, #7 143; R7-RES-NEXT: add.w r0, r1, r0, lsl #2 144; R7-RES-NEXT: bic r0, r0, #7 145; R7-RES-NEXT: sub.w r0, sp, r0 146; R7-RES-NEXT: mov sp, r0 147; R7-RES-NEXT: bl take_ptr 148; R7-RES-NEXT: sub.w r4, r7, #12 149; R7-RES-NEXT: mov sp, r4 150; R7-RES-NEXT: ldr r12, [sp], #4 151; R7-RES-NEXT: pop.w {r4, r6, r7, lr} 152; R7-RES-NEXT: aut r12, lr, sp 153; R7-RES-NEXT: bx lr 154; 155; R7-ABI-LABEL: test2: 156; R7-ABI: .cfi_startproc 157; R7-ABI-NEXT: @ %bb.0: @ %entry 158; R7-ABI-NEXT: pac r12, lr, sp 159; R7-ABI-NEXT: .save {r4, r6, r7, lr} 160; R7-ABI-NEXT: push {r4, r6, r7, lr} 161; R7-ABI-NEXT: .cfi_def_cfa_offset 16 162; R7-ABI-NEXT: .cfi_offset lr, -4 163; R7-ABI-NEXT: .cfi_offset r7, -8 164; R7-ABI-NEXT: .cfi_offset r6, -12 165; R7-ABI-NEXT: .cfi_offset r4, -16 166; R7-ABI-NEXT: .setfp r7, sp, #8 167; R7-ABI-NEXT: add r7, sp, #8 168; R7-ABI-NEXT: .cfi_def_cfa r7, 8 169; R7-ABI-NEXT: .save {ra_auth_code} 170; R7-ABI-NEXT: str r12, [sp, #-4]! 171; R7-ABI-NEXT: .cfi_offset ra_auth_code, -20 172; R7-ABI-NEXT: .pad #4 173; R7-ABI-NEXT: sub sp, #4 174; R7-ABI-NEXT: movs r1, #7 175; R7-ABI-NEXT: add.w r0, r1, r0, lsl #2 176; R7-ABI-NEXT: bic r0, r0, #7 177; R7-ABI-NEXT: sub.w r0, sp, r0 178; R7-ABI-NEXT: mov sp, r0 179; R7-ABI-NEXT: bl take_ptr 180; R7-ABI-NEXT: sub.w r4, r7, #12 181; R7-ABI-NEXT: mov sp, r4 182; R7-ABI-NEXT: ldr r12, [sp], #4 183; R7-ABI-NEXT: pop.w {r4, r6, r7, lr} 184; R7-ABI-NEXT: aut r12, lr, sp 185; R7-ABI-NEXT: bx lr 186; 187; R11-LABEL: test2: 188; R11: .cfi_startproc 189; R11-NEXT: @ %bb.0: @ %entry 190; R11-NEXT: pac r12, lr, sp 191; R11-NEXT: .save {r4, r7, r11, ra_auth_code, lr} 192; R11-NEXT: push.w {r4, r7, r11, r12, lr} 193; R11-NEXT: .cfi_def_cfa_offset 20 194; R11-NEXT: .cfi_offset lr, -4 195; R11-NEXT: .cfi_offset ra_auth_code, -8 196; R11-NEXT: .cfi_offset r11, -12 197; R11-NEXT: .cfi_offset r7, -16 198; R11-NEXT: .cfi_offset r4, -20 199; R11-NEXT: .setfp r11, sp, #8 200; R11-NEXT: add.w r11, sp, #8 201; R11-NEXT: .cfi_def_cfa r11, 12 202; R11-NEXT: .pad #4 203; R11-NEXT: sub sp, #4 204; R11-NEXT: movs r1, #7 205; R11-NEXT: add.w r0, r1, r0, lsl #2 206; R11-NEXT: bic r0, r0, #7 207; R11-NEXT: sub.w r0, sp, r0 208; R11-NEXT: mov sp, r0 209; R11-NEXT: bl take_ptr 210; R11-NEXT: sub.w r4, r11, #8 211; R11-NEXT: mov sp, r4 212; R11-NEXT: pop.w {r4, r7, r11, r12, lr} 213; R11-NEXT: aut r12, lr, sp 214; R11-NEXT: bx lr 215; 216; R11-RES-LABEL: test2: 217; R11-RES: .cfi_startproc 218; R11-RES-NEXT: @ %bb.0: @ %entry 219; R11-RES-NEXT: pac r12, lr, sp 220; R11-RES-NEXT: .save {r4, r7, ra_auth_code} 221; R11-RES-NEXT: push.w {r4, r7, r12} 222; R11-RES-NEXT: .cfi_def_cfa_offset 12 223; R11-RES-NEXT: .cfi_offset ra_auth_code, -4 224; R11-RES-NEXT: .cfi_offset r7, -8 225; R11-RES-NEXT: .cfi_offset r4, -12 226; R11-RES-NEXT: .save {r11, lr} 227; R11-RES-NEXT: push.w {r11, lr} 228; R11-RES-NEXT: .cfi_def_cfa_offset 20 229; R11-RES-NEXT: .cfi_offset lr, -16 230; R11-RES-NEXT: .cfi_offset r11, -20 231; R11-RES-NEXT: .setfp r11, sp 232; R11-RES-NEXT: mov r11, sp 233; R11-RES-NEXT: .cfi_def_cfa_register r11 234; R11-RES-NEXT: .pad #4 235; R11-RES-NEXT: sub sp, #4 236; R11-RES-NEXT: movs r1, #7 237; R11-RES-NEXT: add.w r0, r1, r0, lsl #2 238; R11-RES-NEXT: bic r0, r0, #7 239; R11-RES-NEXT: sub.w r0, sp, r0 240; R11-RES-NEXT: mov sp, r0 241; R11-RES-NEXT: bl take_ptr 242; R11-RES-NEXT: mov sp, r11 243; R11-RES-NEXT: pop.w {r11, lr} 244; R11-RES-NEXT: pop.w {r4, r7, r12} 245; R11-RES-NEXT: aut r12, lr, sp 246; R11-RES-NEXT: bx lr 247; 248; R11-ABI-LABEL: test2: 249; R11-ABI: .cfi_startproc 250; R11-ABI-NEXT: @ %bb.0: @ %entry 251; R11-ABI-NEXT: pac r12, lr, sp 252; R11-ABI-NEXT: .save {r4, r7, ra_auth_code} 253; R11-ABI-NEXT: push.w {r4, r7, r12} 254; R11-ABI-NEXT: .cfi_def_cfa_offset 12 255; R11-ABI-NEXT: .cfi_offset ra_auth_code, -4 256; R11-ABI-NEXT: .cfi_offset r7, -8 257; R11-ABI-NEXT: .cfi_offset r4, -12 258; R11-ABI-NEXT: .save {r11, lr} 259; R11-ABI-NEXT: push.w {r11, lr} 260; R11-ABI-NEXT: .cfi_def_cfa_offset 20 261; R11-ABI-NEXT: .cfi_offset lr, -16 262; R11-ABI-NEXT: .cfi_offset r11, -20 263; R11-ABI-NEXT: .setfp r11, sp 264; R11-ABI-NEXT: mov r11, sp 265; R11-ABI-NEXT: .cfi_def_cfa_register r11 266; R11-ABI-NEXT: .pad #4 267; R11-ABI-NEXT: sub sp, #4 268; R11-ABI-NEXT: movs r1, #7 269; R11-ABI-NEXT: add.w r0, r1, r0, lsl #2 270; R11-ABI-NEXT: bic r0, r0, #7 271; R11-ABI-NEXT: sub.w r0, sp, r0 272; R11-ABI-NEXT: mov sp, r0 273; R11-ABI-NEXT: bl take_ptr 274; R11-ABI-NEXT: mov sp, r11 275; R11-ABI-NEXT: pop.w {r11, lr} 276; R11-ABI-NEXT: pop.w {r4, r7, r12} 277; R11-ABI-NEXT: aut r12, lr, sp 278; R11-ABI-NEXT: bx lr 279entry: 280 %vla = alloca i32, i32 %n, align 4 281 call void @take_ptr(ptr noundef nonnull %vla) 282 ret void 283} 284 285; void test3(int c, float e, int z) { 286; if (c) 287; knr(); 288; take_ptr(alloca(z)); 289; if (e) 290; knr(); 291; } 292define void @test3(i32 noundef %c, float noundef %e, i32 noundef %z) "sign-return-address"="non-leaf" { 293; R7-LABEL: test3: 294; R7: .cfi_startproc 295; R7-NEXT: @ %bb.0: @ %entry 296; R7-NEXT: pac r12, lr, sp 297; R7-NEXT: .save {r4, r5, r6, r7, r8, ra_auth_code, lr} 298; R7-NEXT: push.w {r4, r5, r6, r7, r8, r12, lr} 299; R7-NEXT: .cfi_def_cfa_offset 28 300; R7-NEXT: .cfi_offset lr, -4 301; R7-NEXT: .cfi_offset ra_auth_code, -8 302; R7-NEXT: .cfi_offset r8, -12 303; R7-NEXT: .cfi_offset r7, -16 304; R7-NEXT: .cfi_offset r6, -20 305; R7-NEXT: .cfi_offset r5, -24 306; R7-NEXT: .cfi_offset r4, -28 307; R7-NEXT: .setfp r7, sp, #12 308; R7-NEXT: add r7, sp, #12 309; R7-NEXT: .cfi_def_cfa r7, 16 310; R7-NEXT: .pad #4 311; R7-NEXT: sub sp, #4 312; R7-NEXT: cmp r0, #0 313; R7-NEXT: mov r5, r2 314; R7-NEXT: mov r4, r1 315; R7-NEXT: it ne 316; R7-NEXT: blne knr 317; R7-NEXT: adds r0, r5, #7 318; R7-NEXT: bic r0, r0, #7 319; R7-NEXT: sub.w r0, sp, r0 320; R7-NEXT: mov sp, r0 321; R7-NEXT: bl take_ptr 322; R7-NEXT: mov r0, r4 323; R7-NEXT: movs r1, #0 324; R7-NEXT: bl __aeabi_fcmpeq 325; R7-NEXT: cmp r0, #0 326; R7-NEXT: it eq 327; R7-NEXT: bleq knr 328; R7-NEXT: sub.w r4, r7, #12 329; R7-NEXT: mov sp, r4 330; R7-NEXT: pop.w {r4, r5, r6, r7, r8, r12, lr} 331; R7-NEXT: aut r12, lr, sp 332; R7-NEXT: bx lr 333; 334; R7-RES-LABEL: test3: 335; R7-RES: .cfi_startproc 336; R7-RES-NEXT: @ %bb.0: @ %entry 337; R7-RES-NEXT: pac r12, lr, sp 338; R7-RES-NEXT: .save {r4, r5, r6, r7, lr} 339; R7-RES-NEXT: push {r4, r5, r6, r7, lr} 340; R7-RES-NEXT: .cfi_def_cfa_offset 20 341; R7-RES-NEXT: .cfi_offset lr, -4 342; R7-RES-NEXT: .cfi_offset r7, -8 343; R7-RES-NEXT: .cfi_offset r6, -12 344; R7-RES-NEXT: .cfi_offset r5, -16 345; R7-RES-NEXT: .cfi_offset r4, -20 346; R7-RES-NEXT: .setfp r7, sp, #12 347; R7-RES-NEXT: add r7, sp, #12 348; R7-RES-NEXT: .cfi_def_cfa r7, 8 349; R7-RES-NEXT: .save {r8, ra_auth_code} 350; R7-RES-NEXT: push.w {r8, r12} 351; R7-RES-NEXT: .cfi_offset ra_auth_code, -24 352; R7-RES-NEXT: .cfi_offset r8, -28 353; R7-RES-NEXT: .pad #4 354; R7-RES-NEXT: sub sp, #4 355; R7-RES-NEXT: cmp r0, #0 356; R7-RES-NEXT: mov r5, r2 357; R7-RES-NEXT: mov r4, r1 358; R7-RES-NEXT: it ne 359; R7-RES-NEXT: blne knr 360; R7-RES-NEXT: adds r0, r5, #7 361; R7-RES-NEXT: bic r0, r0, #7 362; R7-RES-NEXT: sub.w r0, sp, r0 363; R7-RES-NEXT: mov sp, r0 364; R7-RES-NEXT: bl take_ptr 365; R7-RES-NEXT: mov r0, r4 366; R7-RES-NEXT: movs r1, #0 367; R7-RES-NEXT: bl __aeabi_fcmpeq 368; R7-RES-NEXT: cmp r0, #0 369; R7-RES-NEXT: it eq 370; R7-RES-NEXT: bleq knr 371; R7-RES-NEXT: sub.w r4, r7, #20 372; R7-RES-NEXT: mov sp, r4 373; R7-RES-NEXT: pop.w {r8, r12} 374; R7-RES-NEXT: pop.w {r4, r5, r6, r7, lr} 375; R7-RES-NEXT: aut r12, lr, sp 376; R7-RES-NEXT: bx lr 377; 378; R7-ABI-LABEL: test3: 379; R7-ABI: .cfi_startproc 380; R7-ABI-NEXT: @ %bb.0: @ %entry 381; R7-ABI-NEXT: pac r12, lr, sp 382; R7-ABI-NEXT: .save {r4, r5, r6, r7, lr} 383; R7-ABI-NEXT: push {r4, r5, r6, r7, lr} 384; R7-ABI-NEXT: .cfi_def_cfa_offset 20 385; R7-ABI-NEXT: .cfi_offset lr, -4 386; R7-ABI-NEXT: .cfi_offset r7, -8 387; R7-ABI-NEXT: .cfi_offset r6, -12 388; R7-ABI-NEXT: .cfi_offset r5, -16 389; R7-ABI-NEXT: .cfi_offset r4, -20 390; R7-ABI-NEXT: .setfp r7, sp, #12 391; R7-ABI-NEXT: add r7, sp, #12 392; R7-ABI-NEXT: .cfi_def_cfa r7, 8 393; R7-ABI-NEXT: .save {r8, ra_auth_code} 394; R7-ABI-NEXT: push.w {r8, r12} 395; R7-ABI-NEXT: .cfi_offset ra_auth_code, -24 396; R7-ABI-NEXT: .cfi_offset r8, -28 397; R7-ABI-NEXT: .pad #4 398; R7-ABI-NEXT: sub sp, #4 399; R7-ABI-NEXT: cmp r0, #0 400; R7-ABI-NEXT: mov r5, r2 401; R7-ABI-NEXT: mov r4, r1 402; R7-ABI-NEXT: it ne 403; R7-ABI-NEXT: blne knr 404; R7-ABI-NEXT: adds r0, r5, #7 405; R7-ABI-NEXT: bic r0, r0, #7 406; R7-ABI-NEXT: sub.w r0, sp, r0 407; R7-ABI-NEXT: mov sp, r0 408; R7-ABI-NEXT: bl take_ptr 409; R7-ABI-NEXT: mov r0, r4 410; R7-ABI-NEXT: movs r1, #0 411; R7-ABI-NEXT: bl __aeabi_fcmpeq 412; R7-ABI-NEXT: cmp r0, #0 413; R7-ABI-NEXT: it eq 414; R7-ABI-NEXT: bleq knr 415; R7-ABI-NEXT: sub.w r4, r7, #20 416; R7-ABI-NEXT: mov sp, r4 417; R7-ABI-NEXT: pop.w {r8, r12} 418; R7-ABI-NEXT: pop.w {r4, r5, r6, r7, lr} 419; R7-ABI-NEXT: aut r12, lr, sp 420; R7-ABI-NEXT: bx lr 421; 422; R11-LABEL: test3: 423; R11: .cfi_startproc 424; R11-NEXT: @ %bb.0: @ %entry 425; R11-NEXT: pac r12, lr, sp 426; R11-NEXT: .save {r4, r5, r6, r7, r11, ra_auth_code, lr} 427; R11-NEXT: push.w {r4, r5, r6, r7, r11, r12, lr} 428; R11-NEXT: .cfi_def_cfa_offset 28 429; R11-NEXT: .cfi_offset lr, -4 430; R11-NEXT: .cfi_offset ra_auth_code, -8 431; R11-NEXT: .cfi_offset r11, -12 432; R11-NEXT: .cfi_offset r7, -16 433; R11-NEXT: .cfi_offset r6, -20 434; R11-NEXT: .cfi_offset r5, -24 435; R11-NEXT: .cfi_offset r4, -28 436; R11-NEXT: .setfp r11, sp, #16 437; R11-NEXT: add.w r11, sp, #16 438; R11-NEXT: .cfi_def_cfa r11, 12 439; R11-NEXT: .pad #4 440; R11-NEXT: sub sp, #4 441; R11-NEXT: cmp r0, #0 442; R11-NEXT: mov r5, r2 443; R11-NEXT: mov r4, r1 444; R11-NEXT: it ne 445; R11-NEXT: blne knr 446; R11-NEXT: adds r0, r5, #7 447; R11-NEXT: bic r0, r0, #7 448; R11-NEXT: sub.w r0, sp, r0 449; R11-NEXT: mov sp, r0 450; R11-NEXT: bl take_ptr 451; R11-NEXT: mov r0, r4 452; R11-NEXT: movs r1, #0 453; R11-NEXT: bl __aeabi_fcmpeq 454; R11-NEXT: cmp r0, #0 455; R11-NEXT: it eq 456; R11-NEXT: bleq knr 457; R11-NEXT: sub.w r4, r11, #16 458; R11-NEXT: mov sp, r4 459; R11-NEXT: pop.w {r4, r5, r6, r7, r11, r12, lr} 460; R11-NEXT: aut r12, lr, sp 461; R11-NEXT: bx lr 462; 463; R11-RES-LABEL: test3: 464; R11-RES: .cfi_startproc 465; R11-RES-NEXT: @ %bb.0: @ %entry 466; R11-RES-NEXT: pac r12, lr, sp 467; R11-RES-NEXT: .save {r4, r5, r6, r7, ra_auth_code} 468; R11-RES-NEXT: push.w {r4, r5, r6, r7, r12} 469; R11-RES-NEXT: .cfi_def_cfa_offset 20 470; R11-RES-NEXT: .cfi_offset ra_auth_code, -4 471; R11-RES-NEXT: .cfi_offset r7, -8 472; R11-RES-NEXT: .cfi_offset r6, -12 473; R11-RES-NEXT: .cfi_offset r5, -16 474; R11-RES-NEXT: .cfi_offset r4, -20 475; R11-RES-NEXT: .save {r11, lr} 476; R11-RES-NEXT: push.w {r11, lr} 477; R11-RES-NEXT: .cfi_def_cfa_offset 28 478; R11-RES-NEXT: .cfi_offset lr, -24 479; R11-RES-NEXT: .cfi_offset r11, -28 480; R11-RES-NEXT: .setfp r11, sp 481; R11-RES-NEXT: mov r11, sp 482; R11-RES-NEXT: .cfi_def_cfa_register r11 483; R11-RES-NEXT: .pad #4 484; R11-RES-NEXT: sub sp, #4 485; R11-RES-NEXT: cmp r0, #0 486; R11-RES-NEXT: mov r5, r2 487; R11-RES-NEXT: mov r4, r1 488; R11-RES-NEXT: it ne 489; R11-RES-NEXT: blne knr 490; R11-RES-NEXT: adds r0, r5, #7 491; R11-RES-NEXT: bic r0, r0, #7 492; R11-RES-NEXT: sub.w r0, sp, r0 493; R11-RES-NEXT: mov sp, r0 494; R11-RES-NEXT: bl take_ptr 495; R11-RES-NEXT: mov r0, r4 496; R11-RES-NEXT: movs r1, #0 497; R11-RES-NEXT: bl __aeabi_fcmpeq 498; R11-RES-NEXT: cmp r0, #0 499; R11-RES-NEXT: it eq 500; R11-RES-NEXT: bleq knr 501; R11-RES-NEXT: mov sp, r11 502; R11-RES-NEXT: pop.w {r11, lr} 503; R11-RES-NEXT: pop.w {r4, r5, r6, r7, r12} 504; R11-RES-NEXT: aut r12, lr, sp 505; R11-RES-NEXT: bx lr 506; 507; R11-ABI-LABEL: test3: 508; R11-ABI: .cfi_startproc 509; R11-ABI-NEXT: @ %bb.0: @ %entry 510; R11-ABI-NEXT: pac r12, lr, sp 511; R11-ABI-NEXT: .save {r4, r5, r6, r7, ra_auth_code} 512; R11-ABI-NEXT: push.w {r4, r5, r6, r7, r12} 513; R11-ABI-NEXT: .cfi_def_cfa_offset 20 514; R11-ABI-NEXT: .cfi_offset ra_auth_code, -4 515; R11-ABI-NEXT: .cfi_offset r7, -8 516; R11-ABI-NEXT: .cfi_offset r6, -12 517; R11-ABI-NEXT: .cfi_offset r5, -16 518; R11-ABI-NEXT: .cfi_offset r4, -20 519; R11-ABI-NEXT: .save {r11, lr} 520; R11-ABI-NEXT: push.w {r11, lr} 521; R11-ABI-NEXT: .cfi_def_cfa_offset 28 522; R11-ABI-NEXT: .cfi_offset lr, -24 523; R11-ABI-NEXT: .cfi_offset r11, -28 524; R11-ABI-NEXT: .setfp r11, sp 525; R11-ABI-NEXT: mov r11, sp 526; R11-ABI-NEXT: .cfi_def_cfa_register r11 527; R11-ABI-NEXT: .pad #4 528; R11-ABI-NEXT: sub sp, #4 529; R11-ABI-NEXT: cmp r0, #0 530; R11-ABI-NEXT: mov r5, r2 531; R11-ABI-NEXT: mov r4, r1 532; R11-ABI-NEXT: it ne 533; R11-ABI-NEXT: blne knr 534; R11-ABI-NEXT: adds r0, r5, #7 535; R11-ABI-NEXT: bic r0, r0, #7 536; R11-ABI-NEXT: sub.w r0, sp, r0 537; R11-ABI-NEXT: mov sp, r0 538; R11-ABI-NEXT: bl take_ptr 539; R11-ABI-NEXT: mov r0, r4 540; R11-ABI-NEXT: movs r1, #0 541; R11-ABI-NEXT: bl __aeabi_fcmpeq 542; R11-ABI-NEXT: cmp r0, #0 543; R11-ABI-NEXT: it eq 544; R11-ABI-NEXT: bleq knr 545; R11-ABI-NEXT: mov sp, r11 546; R11-ABI-NEXT: pop.w {r11, lr} 547; R11-ABI-NEXT: pop.w {r4, r5, r6, r7, r12} 548; R11-ABI-NEXT: aut r12, lr, sp 549; R11-ABI-NEXT: bx lr 550entry: 551 %tobool.not = icmp eq i32 %c, 0 552 br i1 %tobool.not, label %if.end, label %if.then 553 554if.then: ; preds = %entry 555 tail call void @knr() 556 br label %if.end 557 558if.end: ; preds = %if.then, %entry 559 %0 = alloca i8, i32 %z, align 8 560 call void @take_ptr(ptr noundef nonnull %0) 561 %tobool1 = fcmp une float %e, 0.000000e+00 562 br i1 %tobool1, label %if.then2, label %if.end3 563 564if.then2: ; preds = %if.end 565 call void @knr() 566 br label %if.end3 567 568if.end3: ; preds = %if.then2, %if.end 569 ret void 570} 571 572declare void @knr(...) 573declare void @take_ptr(ptr noundef) 574