201 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -o - %s | FileCheck %s3 4target triple = "arm64-apple-ios"5 6%struct.s = type {double, double }7 8declare void @fn(ptr, ptr)9 10; %l.a and %l.b read memory allocated in the caller and should not block11; shrink-wrapping.12define void @test_regular_pointers(ptr %a, ptr %b) {13; CHECK-LABEL: test_regular_pointers:14; CHECK: ; %bb.0: ; %entry15; CHECK-NEXT: ldr d0, [x0]16; CHECK-NEXT: ldr d1, [x1, #8]17; CHECK-NEXT: mov x8, #1 ; =0x118; CHECK-NEXT: movk x8, #2047, lsl #1619; CHECK-NEXT: fadd d0, d0, d120; CHECK-NEXT: fmov d1, x821; CHECK-NEXT: fcmp d0, d122; CHECK-NEXT: str d0, [x1]23; CHECK-NEXT: b.mi LBB0_224; CHECK-NEXT: b.gt LBB0_225; CHECK-NEXT: ; %bb.1: ; %then26; CHECK-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill27; CHECK-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill28; CHECK-NEXT: .cfi_def_cfa_offset 3229; CHECK-NEXT: .cfi_offset w30, -830; CHECK-NEXT: .cfi_offset w29, -1631; CHECK-NEXT: .cfi_offset w19, -2432; CHECK-NEXT: .cfi_offset w20, -3233; CHECK-NEXT: mov x19, x134; CHECK-NEXT: bl _fn35; CHECK-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload36; CHECK-NEXT: str xzr, [x19]37; CHECK-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload38; CHECK-NEXT: LBB0_2: ; %exit39; CHECK-NEXT: ret40entry:41 %l.a = load double, ptr %a, align 842 %gep.b = getelementptr inbounds %struct.s, ptr %b, i64 0, i32 143 %l.b = load double, ptr %gep.b, align 844 %add = fadd double %l.a, %l.b45 store double %add, ptr %b, align 846 %c = fcmp ueq double %add, 0x7FF000147 br i1 %c, label %then, label %exit48 49then:50 tail call void @fn(ptr %a, ptr %b)51 store double 0.000000e+00, ptr %b, align 852 br label %exit53 54exit:55 ret void56}57 58; %l.b may read memory from the callee's stack due to byval.59define void @test_byval_pointers(ptr %a, ptr byval(%struct.s) %b) {60; CHECK-LABEL: test_byval_pointers:61; CHECK: ; %bb.0: ; %entry62; CHECK-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill63; CHECK-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill64; CHECK-NEXT: .cfi_def_cfa_offset 3265; CHECK-NEXT: .cfi_offset w30, -866; CHECK-NEXT: .cfi_offset w29, -1667; CHECK-NEXT: .cfi_offset w19, -2468; CHECK-NEXT: .cfi_offset w20, -3269; CHECK-NEXT: ldr d0, [sp, #40]70; CHECK-NEXT: ldr d1, [x0]71; CHECK-NEXT: mov x8, #1 ; =0x172; CHECK-NEXT: movk x8, #2047, lsl #1673; CHECK-NEXT: fadd d0, d1, d074; CHECK-NEXT: fmov d1, x875; CHECK-NEXT: fcmp d0, d176; CHECK-NEXT: str d0, [sp, #32]77; CHECK-NEXT: b.mi LBB1_278; CHECK-NEXT: b.gt LBB1_279; CHECK-NEXT: ; %bb.1: ; %then80; CHECK-NEXT: add x1, sp, #3281; CHECK-NEXT: add x19, sp, #3282; CHECK-NEXT: bl _fn83; CHECK-NEXT: str xzr, [x19]84; CHECK-NEXT: LBB1_2: ; %exit85; CHECK-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload86; CHECK-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload87; CHECK-NEXT: ret88entry:89 %l.a = load double, ptr %a, align 890 %gep.b = getelementptr inbounds %struct.s, ptr %b, i64 0, i32 191 %l.b = load double, ptr %gep.b, align 892 %add = fadd double %l.a, %l.b93 store double %add, ptr %b, align 894 %c = fcmp ueq double %add, 0x7FF000195 br i1 %c, label %then, label %exit96 97then:98 tail call void @fn(ptr %a, ptr %b)99 store double 0.000000e+00, ptr %b, align 8100 br label %exit101 102exit:103 ret void104}105 106; %l.b may read memory from the callee's stack due to inalloca.107define void @test_inalloca_pointers(ptr %a, ptr inalloca(%struct.s) %b) {108; CHECK-LABEL: test_inalloca_pointers:109; CHECK: ; %bb.0: ; %entry110; CHECK-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill111; CHECK-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill112; CHECK-NEXT: .cfi_def_cfa_offset 32113; CHECK-NEXT: .cfi_offset w30, -8114; CHECK-NEXT: .cfi_offset w29, -16115; CHECK-NEXT: .cfi_offset w19, -24116; CHECK-NEXT: .cfi_offset w20, -32117; CHECK-NEXT: ldr d0, [sp, #40]118; CHECK-NEXT: ldr d1, [x0]119; CHECK-NEXT: mov x8, #1 ; =0x1120; CHECK-NEXT: movk x8, #2047, lsl #16121; CHECK-NEXT: fadd d0, d1, d0122; CHECK-NEXT: fmov d1, x8123; CHECK-NEXT: fcmp d0, d1124; CHECK-NEXT: str d0, [sp, #32]125; CHECK-NEXT: b.mi LBB2_2126; CHECK-NEXT: b.gt LBB2_2127; CHECK-NEXT: ; %bb.1: ; %then128; CHECK-NEXT: add x1, sp, #32129; CHECK-NEXT: add x19, sp, #32130; CHECK-NEXT: bl _fn131; CHECK-NEXT: str xzr, [x19]132; CHECK-NEXT: LBB2_2: ; %exit133; CHECK-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload134; CHECK-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload135; CHECK-NEXT: ret136entry:137 %l.a = load double, ptr %a, align 8138 %gep.b = getelementptr inbounds %struct.s, ptr %b, i64 0, i32 1139 %l.b = load double, ptr %gep.b, align 8140 %add = fadd double %l.a, %l.b141 store double %add, ptr %b, align 8142 %c = fcmp ueq double %add, 0x7FF0001143 br i1 %c, label %then, label %exit144 145then:146 tail call void @fn(ptr %a, ptr %b)147 store double 0.000000e+00, ptr %b, align 8148 br label %exit149 150exit:151 ret void152}153 154; %l.b may read memory from the callee's stack due to preallocated.155define void @test_preallocated_pointers(ptr %a, ptr preallocated(%struct.s) %b) {156; CHECK-LABEL: test_preallocated_pointers:157; CHECK: ; %bb.0: ; %entry158; CHECK-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill159; CHECK-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill160; CHECK-NEXT: .cfi_def_cfa_offset 32161; CHECK-NEXT: .cfi_offset w30, -8162; CHECK-NEXT: .cfi_offset w29, -16163; CHECK-NEXT: .cfi_offset w19, -24164; CHECK-NEXT: .cfi_offset w20, -32165; CHECK-NEXT: ldr d0, [sp, #40]166; CHECK-NEXT: ldr d1, [x0]167; CHECK-NEXT: mov x8, #1 ; =0x1168; CHECK-NEXT: movk x8, #2047, lsl #16169; CHECK-NEXT: fadd d0, d1, d0170; CHECK-NEXT: fmov d1, x8171; CHECK-NEXT: fcmp d0, d1172; CHECK-NEXT: str d0, [sp, #32]173; CHECK-NEXT: b.mi LBB3_2174; CHECK-NEXT: b.gt LBB3_2175; CHECK-NEXT: ; %bb.1: ; %then176; CHECK-NEXT: add x1, sp, #32177; CHECK-NEXT: add x19, sp, #32178; CHECK-NEXT: bl _fn179; CHECK-NEXT: str xzr, [x19]180; CHECK-NEXT: LBB3_2: ; %exit181; CHECK-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload182; CHECK-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload183; CHECK-NEXT: ret184entry:185 %l.a = load double, ptr %a, align 8186 %gep.b = getelementptr inbounds %struct.s, ptr %b, i64 0, i32 1187 %l.b = load double, ptr %gep.b, align 8188 %add = fadd double %l.a, %l.b189 store double %add, ptr %b, align 8190 %c = fcmp ueq double %add, 0x7FF0001191 br i1 %c, label %then, label %exit192 193then:194 tail call void @fn(ptr %a, ptr %b)195 store double 0.000000e+00, ptr %b, align 8196 br label %exit197 198exit:199 ret void200}201