Upgrade of the IR text tests should be the only thing blocking making typed byval mandatory. Partially done through regex and partially manual.
129 lines
5.8 KiB
YAML
129 lines
5.8 KiB
YAML
# RUN: llc -mtriple=i686-windows --run-pass="x86-cf-opt" %s -o - | FileCheck %s
|
|
|
|
# PR34903
|
|
--- |
|
|
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
|
|
target triple = "i686--windows-msvc"
|
|
|
|
%struct.s = type { i64 }
|
|
|
|
declare void @good(i32, i32, i32, i32)
|
|
|
|
declare void @struct(%struct.s* byval(%struct.s), i32, i32, i32)
|
|
|
|
; Function Attrs: optsize
|
|
define void @test9() #0 {
|
|
entry:
|
|
%p = alloca i32, align 4
|
|
%q = alloca i32, align 4
|
|
%s = alloca %struct.s, align 4
|
|
call void @good(i32 1, i32 2, i32 3, i32 4)
|
|
%pv = ptrtoint i32* %p to i32
|
|
%qv = ptrtoint i32* %q to i32
|
|
call void @struct(%struct.s* byval(%struct.s) %s, i32 6, i32 %qv, i32 %pv)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @llvm.stackprotector(i8*, i8**) #1
|
|
|
|
attributes #0 = { optsize }
|
|
attributes #1 = { nounwind }
|
|
|
|
...
|
|
---
|
|
# CHECK-LABEL: test9
|
|
# CHECK: ADJCALLSTACKDOWN32 16, 0, 16, implicit-def dead $esp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $esp, implicit $ssp
|
|
# CHECK-NEXT: PUSH32i8 4, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: PUSH32i8 3, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: PUSH32i8 2, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: PUSH32i8 1, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: CALLpcrel32 @good, csr_32, implicit $esp, implicit $ssp, implicit-def $esp, implicit-def $ssp
|
|
# CHECK-NEXT: ADJCALLSTACKUP32 16, 0, implicit-def dead $esp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $esp, implicit $ssp
|
|
# CHECK-NEXT: ADJCALLSTACKDOWN32 20, 0, 20, implicit-def dead $esp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $esp, implicit $ssp
|
|
# CHECK-NEXT: %1:gr32 = MOV32rm %stack.2.s, 1, $noreg, 0, $noreg :: (load 4 from %stack.2.s, align 8)
|
|
# CHECK-NEXT: %2:gr32 = MOV32rm %stack.2.s, 1, $noreg, 4, $noreg :: (load 4 from %stack.2.s + 4)
|
|
# CHECK-NEXT: %4:gr32 = LEA32r %stack.0.p, 1, $noreg, 0, $noreg
|
|
# CHECK-NEXT: %5:gr32 = LEA32r %stack.1.q, 1, $noreg, 0, $noreg
|
|
# CHECK-NEXT: PUSH32r %4, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: PUSH32r %5, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: PUSH32i8 6, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: PUSH32r %2, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: PUSH32r %1, implicit-def $esp, implicit $esp
|
|
# CHECK-NEXT: CALLpcrel32 @struct, csr_32, implicit $esp, implicit $ssp, implicit-def $esp, implicit-def $ssp
|
|
# CHECK-NEXT: ADJCALLSTACKUP32 20, 0, implicit-def dead $esp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $esp, implicit $ssp
|
|
# CHECK-NEXT: RET 0
|
|
name: test9
|
|
alignment: 1
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: gr32, preferred-register: '' }
|
|
- { id: 1, class: gr32, preferred-register: '' }
|
|
- { id: 2, class: gr32, preferred-register: '' }
|
|
- { id: 3, class: gr32, preferred-register: '' }
|
|
- { id: 4, class: gr32, preferred-register: '' }
|
|
- { id: 5, class: gr32, preferred-register: '' }
|
|
liveins:
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 0
|
|
offsetAdjustment: 0
|
|
maxAlignment: 8
|
|
adjustsStack: false
|
|
hasCalls: true
|
|
stackProtector: ''
|
|
maxCallFrameSize: 4294967295
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
savePoint: ''
|
|
restorePoint: ''
|
|
fixedStack:
|
|
stack:
|
|
- { id: 0, name: p, type: default, offset: 0, size: 4, alignment: 4,
|
|
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '',
|
|
debug-info-location: '' }
|
|
- { id: 1, name: q, type: default, offset: 0, size: 4, alignment: 4,
|
|
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '',
|
|
debug-info-location: '' }
|
|
- { id: 2, name: s, type: default, offset: 0, size: 8, alignment: 8,
|
|
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '',
|
|
debug-info-location: '' }
|
|
constants:
|
|
body: |
|
|
bb.0.entry:
|
|
ADJCALLSTACKDOWN32 16, 0, 0, implicit-def dead $esp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $esp, implicit $ssp
|
|
%0 = COPY $esp
|
|
MOV32mi %0, 1, $noreg, 12, $noreg, 4 :: (store 4 into stack + 12)
|
|
MOV32mi %0, 1, $noreg, 8, $noreg, 3 :: (store 4 into stack + 8)
|
|
MOV32mi %0, 1, $noreg, 4, $noreg, 2 :: (store 4 into stack + 4)
|
|
MOV32mi %0, 1, $noreg, 0, $noreg, 1 :: (store 4 into stack)
|
|
CALLpcrel32 @good, csr_32, implicit $esp, implicit $ssp, implicit-def $esp, implicit-def $ssp
|
|
ADJCALLSTACKUP32 16, 0, implicit-def dead $esp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $esp, implicit $ssp
|
|
ADJCALLSTACKDOWN32 20, 0, 0, implicit-def dead $esp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $esp, implicit $ssp
|
|
%1 = MOV32rm %stack.2.s, 1, $noreg, 0, $noreg :: (load 4 from %stack.2.s, align 8)
|
|
%2 = MOV32rm %stack.2.s, 1, $noreg, 4, $noreg :: (load 4 from %stack.2.s + 4)
|
|
%3 = COPY $esp
|
|
MOV32mr %3, 1, $noreg, 4, $noreg, killed %2 :: (store 4)
|
|
MOV32mr %3, 1, $noreg, 0, $noreg, killed %1 :: (store 4)
|
|
%4 = LEA32r %stack.0.p, 1, $noreg, 0, $noreg
|
|
MOV32mr %3, 1, $noreg, 16, $noreg, killed %4 :: (store 4 into stack + 16)
|
|
%5 = LEA32r %stack.1.q, 1, $noreg, 0, $noreg
|
|
MOV32mr %3, 1, $noreg, 12, $noreg, killed %5 :: (store 4 into stack + 12)
|
|
MOV32mi %3, 1, $noreg, 8, $noreg, 6 :: (store 4 into stack + 8)
|
|
CALLpcrel32 @struct, csr_32, implicit $esp, implicit $ssp, implicit-def $esp, implicit-def $ssp,
|
|
ADJCALLSTACKUP32 20, 0, implicit-def dead $esp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $esp, implicit $ssp
|
|
RET 0
|
|
|
|
...
|