[llvm] bc1c95d - [ShrinkWrap] Add tests with loads from byval/inalloca/preallocated args.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Tue May 2 12:42:14 PDT 2023


Author: Florian Hahn
Date: 2023-05-02T20:41:58+01:00
New Revision: bc1c95d973b80d7ec7a15d4c5c5248952fc39153

URL: https://github.com/llvm/llvm-project/commit/bc1c95d973b80d7ec7a15d4c5c5248952fc39153
DIFF: https://github.com/llvm/llvm-project/commit/bc1c95d973b80d7ec7a15d4c5c5248952fc39153.diff

LOG: [ShrinkWrap] Add tests with loads from byval/inalloca/preallocated args.

Extra test coverage for D149668.

Added: 
    llvm/test/CodeGen/AArch64/shrink-wrap-byval-inalloca-preallocated.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/AArch64/shrink-wrap-byval-inalloca-preallocated.ll b/llvm/test/CodeGen/AArch64/shrink-wrap-byval-inalloca-preallocated.ll
new file mode 100644
index 0000000000000..16dc402b43021
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/shrink-wrap-byval-inalloca-preallocated.ll
@@ -0,0 +1,201 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
+; RUN: llc -o - %s | FileCheck %s
+
+target triple = "arm64-apple-ios"
+
+%struct.s = type {double, double }
+
+declare void @fn(ptr, ptr)
+
+; %l.a and %l.b read memory allocated in the caller and should not block
+; shrink-wrapping.
+define void @test_regular_pointers(ptr %a, ptr %b) {
+; CHECK-LABEL: test_regular_pointers:
+; CHECK:       ; %bb.0: ; %entry
+; CHECK-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill
+; CHECK-NEXT:    .cfi_def_cfa_offset 32
+; CHECK-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill
+; CHECK-NEXT:    .cfi_offset w30, -8
+; CHECK-NEXT:    .cfi_offset w29, -16
+; CHECK-NEXT:    .cfi_offset w19, -24
+; CHECK-NEXT:    .cfi_offset w20, -32
+; CHECK-NEXT:    ldr d0, [x0]
+; CHECK-NEXT:    mov x8, #1 ; =0x1
+; CHECK-NEXT:    ldr d1, [x1, #8]
+; CHECK-NEXT:    movk x8, #2047, lsl #16
+; CHECK-NEXT:    fadd d0, d0, d1
+; CHECK-NEXT:    fmov d1, x8
+; CHECK-NEXT:    fcmp d0, d1
+; CHECK-NEXT:    str d0, [x1]
+; CHECK-NEXT:    b.mi LBB0_2
+; CHECK-NEXT:    b.gt LBB0_2
+; CHECK-NEXT:  ; %bb.1: ; %then
+; CHECK-NEXT:    mov x19, x1
+; CHECK-NEXT:    bl _fn
+; CHECK-NEXT:    str xzr, [x19]
+; CHECK-NEXT:  LBB0_2: ; %exit
+; CHECK-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
+; CHECK-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
+; CHECK-NEXT:    ret
+entry:
+  %l.a = load double, ptr %a, align 8
+  %gep.b = getelementptr inbounds %struct.s, ptr %b, i64 0, i32 1
+  %l.b = load double, ptr %gep.b, align 8
+  %add = fadd double %l.a, %l.b
+  store double %add, ptr %b, align 8
+  %c = fcmp ueq double %add, 0x7FF0001
+  br i1 %c, label %then, label %exit
+
+then:
+  tail call void @fn(ptr %a, ptr %b)
+  store double 0.000000e+00, ptr %b, align 8
+  br label %exit
+
+exit:
+  ret void
+}
+
+; %l.b may read memory from the callee's stack due to byval.
+define void @test_byval_pointers(ptr %a, ptr byval(%struct.s) %b) {
+; CHECK-LABEL: test_byval_pointers:
+; CHECK:       ; %bb.0: ; %entry
+; CHECK-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill
+; CHECK-NEXT:    .cfi_def_cfa_offset 32
+; CHECK-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill
+; CHECK-NEXT:    .cfi_offset w30, -8
+; CHECK-NEXT:    .cfi_offset w29, -16
+; CHECK-NEXT:    .cfi_offset w19, -24
+; CHECK-NEXT:    .cfi_offset w20, -32
+; CHECK-NEXT:    ldr d0, [sp, #40]
+; CHECK-NEXT:    mov x8, #1 ; =0x1
+; CHECK-NEXT:    ldr d1, [x0]
+; CHECK-NEXT:    movk x8, #2047, lsl #16
+; CHECK-NEXT:    fadd d0, d1, d0
+; CHECK-NEXT:    fmov d1, x8
+; CHECK-NEXT:    fcmp d0, d1
+; CHECK-NEXT:    str d0, [sp, #32]
+; CHECK-NEXT:    b.mi LBB1_2
+; CHECK-NEXT:    b.gt LBB1_2
+; CHECK-NEXT:  ; %bb.1: ; %then
+; CHECK-NEXT:    add x1, sp, #32
+; CHECK-NEXT:    add x19, sp, #32
+; CHECK-NEXT:    bl _fn
+; CHECK-NEXT:    str xzr, [x19]
+; CHECK-NEXT:  LBB1_2: ; %exit
+; CHECK-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
+; CHECK-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
+; CHECK-NEXT:    ret
+entry:
+  %l.a = load double, ptr %a, align 8
+  %gep.b = getelementptr inbounds %struct.s, ptr %b, i64 0, i32 1
+  %l.b = load double, ptr %gep.b, align 8
+  %add = fadd double %l.a, %l.b
+  store double %add, ptr %b, align 8
+  %c = fcmp ueq double %add, 0x7FF0001
+  br i1 %c, label %then, label %exit
+
+then:
+  tail call void @fn(ptr %a, ptr %b)
+  store double 0.000000e+00, ptr %b, align 8
+  br label %exit
+
+exit:
+  ret void
+}
+
+; %l.b may read memory from the callee's stack due to inalloca.
+define void @test_inalloca_pointers(ptr %a, ptr inalloca(%struct.s) %b) {
+; CHECK-LABEL: test_inalloca_pointers:
+; CHECK:       ; %bb.0: ; %entry
+; CHECK-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill
+; CHECK-NEXT:    .cfi_def_cfa_offset 32
+; CHECK-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill
+; CHECK-NEXT:    .cfi_offset w30, -8
+; CHECK-NEXT:    .cfi_offset w29, -16
+; CHECK-NEXT:    .cfi_offset w19, -24
+; CHECK-NEXT:    .cfi_offset w20, -32
+; CHECK-NEXT:    ldr d0, [sp, #40]
+; CHECK-NEXT:    mov x8, #1 ; =0x1
+; CHECK-NEXT:    ldr d1, [x0]
+; CHECK-NEXT:    movk x8, #2047, lsl #16
+; CHECK-NEXT:    fadd d0, d1, d0
+; CHECK-NEXT:    fmov d1, x8
+; CHECK-NEXT:    fcmp d0, d1
+; CHECK-NEXT:    str d0, [sp, #32]
+; CHECK-NEXT:    b.mi LBB2_2
+; CHECK-NEXT:    b.gt LBB2_2
+; CHECK-NEXT:  ; %bb.1: ; %then
+; CHECK-NEXT:    add x1, sp, #32
+; CHECK-NEXT:    add x19, sp, #32
+; CHECK-NEXT:    bl _fn
+; CHECK-NEXT:    str xzr, [x19]
+; CHECK-NEXT:  LBB2_2: ; %exit
+; CHECK-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
+; CHECK-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
+; CHECK-NEXT:    ret
+entry:
+  %l.a = load double, ptr %a, align 8
+  %gep.b = getelementptr inbounds %struct.s, ptr %b, i64 0, i32 1
+  %l.b = load double, ptr %gep.b, align 8
+  %add = fadd double %l.a, %l.b
+  store double %add, ptr %b, align 8
+  %c = fcmp ueq double %add, 0x7FF0001
+  br i1 %c, label %then, label %exit
+
+then:
+  tail call void @fn(ptr %a, ptr %b)
+  store double 0.000000e+00, ptr %b, align 8
+  br label %exit
+
+exit:
+  ret void
+}
+
+; %l.b may read memory from the callee's stack due to preallocated.
+define void @test_preallocated_pointers(ptr %a, ptr preallocated(%struct.s) %b) {
+; CHECK-LABEL: test_preallocated_pointers:
+; CHECK:       ; %bb.0: ; %entry
+; CHECK-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill
+; CHECK-NEXT:    .cfi_def_cfa_offset 32
+; CHECK-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill
+; CHECK-NEXT:    .cfi_offset w30, -8
+; CHECK-NEXT:    .cfi_offset w29, -16
+; CHECK-NEXT:    .cfi_offset w19, -24
+; CHECK-NEXT:    .cfi_offset w20, -32
+; CHECK-NEXT:    ldr d0, [sp, #40]
+; CHECK-NEXT:    mov x8, #1 ; =0x1
+; CHECK-NEXT:    ldr d1, [x0]
+; CHECK-NEXT:    movk x8, #2047, lsl #16
+; CHECK-NEXT:    fadd d0, d1, d0
+; CHECK-NEXT:    fmov d1, x8
+; CHECK-NEXT:    fcmp d0, d1
+; CHECK-NEXT:    str d0, [sp, #32]
+; CHECK-NEXT:    b.mi LBB3_2
+; CHECK-NEXT:    b.gt LBB3_2
+; CHECK-NEXT:  ; %bb.1: ; %then
+; CHECK-NEXT:    add x1, sp, #32
+; CHECK-NEXT:    add x19, sp, #32
+; CHECK-NEXT:    bl _fn
+; CHECK-NEXT:    str xzr, [x19]
+; CHECK-NEXT:  LBB3_2: ; %exit
+; CHECK-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
+; CHECK-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
+; CHECK-NEXT:    ret
+entry:
+  %l.a = load double, ptr %a, align 8
+  %gep.b = getelementptr inbounds %struct.s, ptr %b, i64 0, i32 1
+  %l.b = load double, ptr %gep.b, align 8
+  %add = fadd double %l.a, %l.b
+  store double %add, ptr %b, align 8
+  %c = fcmp ueq double %add, 0x7FF0001
+  br i1 %c, label %then, label %exit
+
+then:
+  tail call void @fn(ptr %a, ptr %b)
+  store double 0.000000e+00, ptr %b, align 8
+  br label %exit
+
+exit:
+  ret void
+}
+


        


More information about the llvm-commits mailing list