230 lines
6.7 KiB
Plaintext
230 lines
6.7 KiB
Plaintext
|
--- |
|
||
|
; pr37472
|
||
|
; These test verify that shrink-wrap does not set the restore point
|
||
|
; to a position where the stack might still be accessed by a load or store
|
||
|
|
||
|
; RUN: llc -x=mir -simplify-mir -run-pass=shrink-wrap -o - %s | FileCheck %s
|
||
|
; CHECK: name: compiler_pop_stack
|
||
|
; CHECK: frameInfo:
|
||
|
; CHECK-NOT: savePoint:
|
||
|
; CHECK-NOT: restorePoint:
|
||
|
; CHECK: stack:
|
||
|
; CHECK: name: f
|
||
|
; CHECK: frameInfo:
|
||
|
; CHECK: savePoint: '%bb.2'
|
||
|
; CHECK-NEXT: restorePoint: '%bb.4'
|
||
|
; CHECK-NEXT: stack:
|
||
|
|
||
|
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
||
|
target triple = "aarch64-arm-none-eabi"
|
||
|
|
||
|
%struct.S = type { i32, i32 }
|
||
|
|
||
|
@__const.f.arr = private unnamed_addr constant [4 x i8] c"\01\02\03\04", align 1
|
||
|
|
||
|
|
||
|
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture)
|
||
|
|
||
|
|
||
|
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture)
|
||
|
|
||
|
|
||
|
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1 immarg)
|
||
|
; Test from: https://bugs.llvm.org/show_bug.cgi?id=42136
|
||
|
define void @compiler_pop_stack(i32 %num) {
|
||
|
entry:
|
||
|
%rstack = alloca [16 x i32], align 4
|
||
|
%tmp = bitcast [16 x i32]* %rstack to i8*
|
||
|
call void @llvm.lifetime.start.p0i8(i64 64, i8* nonnull %tmp)
|
||
|
%cmp = icmp ult i32 %num, 2
|
||
|
br i1 %cmp, label %cleanup, label %if.end
|
||
|
|
||
|
if.end:
|
||
|
%arrayidx1 = bitcast [16 x i32]* %rstack to i32*
|
||
|
store volatile i32 %num, i32* %arrayidx1, align 4
|
||
|
br label %while.body
|
||
|
|
||
|
while.body:
|
||
|
%ptr.017 = phi i32 [ 1, %if.end ], [ %ptr.1, %if.end7 ]
|
||
|
%dec = add i32 %ptr.017, -1
|
||
|
%idxprom = zext i32 %dec to i64
|
||
|
%arrayidx2 = getelementptr inbounds [16 x i32], [16 x i32]* %rstack, i64 0, i64 %idxprom
|
||
|
%tmp1 = load volatile i32, i32* %arrayidx2, align 4
|
||
|
%cmp3 = icmp eq i32 %tmp1, 0
|
||
|
br i1 %cmp3, label %if.end7, label %if.then4
|
||
|
|
||
|
if.then4:
|
||
|
%sunkaddr = mul i64 %idxprom, 4
|
||
|
%0 = bitcast [16 x i32]* %rstack to i8*
|
||
|
%sunkaddr2 = getelementptr inbounds i8, i8* %0, i64 %sunkaddr
|
||
|
%1 = bitcast i8* %sunkaddr2 to i32*
|
||
|
store volatile i32 %tmp1, i32* %1, align 4
|
||
|
br label %if.end7
|
||
|
|
||
|
if.end7:
|
||
|
%ptr.1 = phi i32 [ %ptr.017, %if.then4 ], [ %dec, %while.body ]
|
||
|
%cmp1 = icmp eq i32 %ptr.1, 0
|
||
|
br i1 %cmp1, label %cleanup, label %while.body
|
||
|
|
||
|
cleanup:
|
||
|
%2 = bitcast [16 x i32]* %rstack to i8*
|
||
|
call void @llvm.lifetime.end.p0i8(i64 64, i8* nonnull %2)
|
||
|
ret void
|
||
|
}
|
||
|
; Test from: https://bugs.llvm.org/show_bug.cgi?id=37472
|
||
|
define i32 @f(%struct.S* nocapture %arg, i32 %arg1) {
|
||
|
bb:
|
||
|
%tmp = alloca [4 x i8], align 1
|
||
|
%tmp2 = icmp ugt i32 %arg1, 4
|
||
|
br i1 %tmp2, label %bb16, label %bb3
|
||
|
|
||
|
bb3:
|
||
|
%tmp41 = bitcast [4 x i8]* %tmp to i8*
|
||
|
call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %tmp41)
|
||
|
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 1 %tmp41, i8* align 1 getelementptr inbounds ([4 x i8], [4 x i8]* @__const.f.arr, i64 0, i64 0), i64 4, i1 true)
|
||
|
%tmp5 = zext i32 %arg1 to i64
|
||
|
%tmp6 = getelementptr inbounds [4 x i8], [4 x i8]* %tmp, i64 0, i64 %tmp5
|
||
|
%tmp7 = load volatile i8, i8* %tmp6, align 1
|
||
|
%tmp8 = zext i8 %tmp7 to i32
|
||
|
%tmp92 = bitcast %struct.S* %arg to i32*
|
||
|
store i32 %tmp8, i32* %tmp92, align 4
|
||
|
%tmp10 = icmp ult i32 %arg1, 3
|
||
|
br i1 %tmp10, label %bb11, label %bb15
|
||
|
|
||
|
bb11:
|
||
|
%0 = bitcast [4 x i8]* %tmp to i8*
|
||
|
%sunkaddr = getelementptr inbounds i8, i8* %0, i64 %tmp5
|
||
|
%tmp12 = load volatile i8, i8* %sunkaddr, align 1
|
||
|
%tmp13 = zext i8 %tmp12 to i32
|
||
|
%tmp14 = getelementptr inbounds %struct.S, %struct.S* %arg, i64 0, i32 1
|
||
|
store i32 %tmp13, i32* %tmp14, align 4
|
||
|
br label %bb15
|
||
|
|
||
|
bb15:
|
||
|
%1 = bitcast [4 x i8]* %tmp to i8*
|
||
|
call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %1)
|
||
|
br label %bb16
|
||
|
|
||
|
bb16:
|
||
|
%tmp17 = phi i32 [ 0, %bb15 ], [ 1, %bb ]
|
||
|
ret i32 %tmp17
|
||
|
}
|
||
|
|
||
|
|
||
|
declare void @llvm.stackprotector(i8*, i8**)
|
||
|
|
||
|
...
|
||
|
---
|
||
|
name: compiler_pop_stack
|
||
|
alignment: 4
|
||
|
tracksRegLiveness: true
|
||
|
liveins:
|
||
|
- { reg: '$w0' }
|
||
|
frameInfo:
|
||
|
maxAlignment: 4
|
||
|
maxCallFrameSize: 0
|
||
|
localFrameSize: 64
|
||
|
stack:
|
||
|
- { id: 0, name: rstack, size: 64, alignment: 4, stack-id: default, local-offset: -64 }
|
||
|
machineFunctionInfo: {}
|
||
|
body: |
|
||
|
bb.0.entry:
|
||
|
liveins: $w0
|
||
|
|
||
|
dead $wzr = SUBSWri renamable $w0, 2, 0, implicit-def $nzcv
|
||
|
Bcc 3, %bb.6, implicit killed $nzcv
|
||
|
B %bb.1
|
||
|
|
||
|
bb.1.if.end:
|
||
|
liveins: $w0
|
||
|
|
||
|
STRWui killed renamable $w0, %stack.0.rstack, 0 :: (volatile store 4 into %ir.arrayidx1)
|
||
|
renamable $w9 = MOVi32imm 1
|
||
|
renamable $x8 = ADDXri %stack.0.rstack, 0, 0
|
||
|
|
||
|
bb.2.while.body:
|
||
|
successors: %bb.3(0x30000000), %bb.4(0x50000000)
|
||
|
liveins: $w9, $x8
|
||
|
|
||
|
renamable $w10 = SUBWri renamable $w9, 1, 0, implicit-def $x10
|
||
|
renamable $w11 = LDRWroW renamable $x8, renamable $w10, 0, 1 :: (volatile load 4 from %ir.arrayidx2)
|
||
|
CBNZW renamable $w11, %bb.4
|
||
|
|
||
|
bb.3:
|
||
|
liveins: $x8, $x10
|
||
|
|
||
|
renamable $w9 = COPY renamable $w10, implicit killed $x10
|
||
|
B %bb.5
|
||
|
|
||
|
bb.4.if.then4:
|
||
|
liveins: $w9, $w11, $x8, $x10
|
||
|
|
||
|
STRWroX killed renamable $w11, renamable $x8, killed renamable $x10, 0, 1 :: (volatile store 4 into %ir.1)
|
||
|
|
||
|
bb.5.if.end7:
|
||
|
successors: %bb.6(0x04000000), %bb.2(0x7c000000)
|
||
|
liveins: $w9, $x8
|
||
|
|
||
|
CBNZW renamable $w9, %bb.2
|
||
|
B %bb.6
|
||
|
|
||
|
bb.6.cleanup:
|
||
|
RET_ReallyLR
|
||
|
|
||
|
...
|
||
|
---
|
||
|
name: f
|
||
|
alignment: 4
|
||
|
tracksRegLiveness: true
|
||
|
liveins:
|
||
|
- { reg: '$x0' }
|
||
|
- { reg: '$w1' }
|
||
|
frameInfo:
|
||
|
maxAlignment: 4
|
||
|
maxCallFrameSize: 0
|
||
|
localFrameSize: 4
|
||
|
stack:
|
||
|
- { id: 0, name: tmp, size: 4, alignment: 4, stack-id: default, local-offset: -4 }
|
||
|
machineFunctionInfo: {}
|
||
|
body: |
|
||
|
bb.0.bb:
|
||
|
successors: %bb.1, %bb.2
|
||
|
liveins: $w1, $x0
|
||
|
|
||
|
dead $wzr = SUBSWri renamable $w1, 4, 0, implicit-def $nzcv
|
||
|
Bcc 9, %bb.2, implicit killed $nzcv
|
||
|
|
||
|
bb.1:
|
||
|
renamable $w0 = MOVi32imm 1
|
||
|
B %bb.5
|
||
|
|
||
|
bb.2.bb3:
|
||
|
successors: %bb.3, %bb.4
|
||
|
liveins: $w1, $x0
|
||
|
|
||
|
renamable $w9 = MOVi32imm 67305985
|
||
|
renamable $w8 = ORRWrs $wzr, renamable $w1, 0, implicit-def $x8
|
||
|
STRWui killed renamable $w9, %stack.0.tmp, 0 :: (volatile store 4 into %ir.tmp41)
|
||
|
renamable $x9 = ADDXri %stack.0.tmp, 0, 0
|
||
|
renamable $w10 = LDRBBroX renamable $x9, renamable $x8, 0, 0 :: (volatile load 1 from %ir.tmp6)
|
||
|
dead $wzr = SUBSWri killed renamable $w1, 2, 0, implicit-def $nzcv
|
||
|
STRWui killed renamable $w10, renamable $x0, 0 :: (store 4 into %ir.tmp92)
|
||
|
Bcc 8, %bb.4, implicit killed $nzcv
|
||
|
B %bb.3
|
||
|
|
||
|
bb.3.bb11:
|
||
|
liveins: $x0, $x8, $x9
|
||
|
|
||
|
renamable $w8 = LDRBBroX killed renamable $x9, killed renamable $x8, 0, 0 :: (volatile load 1 from %ir.sunkaddr)
|
||
|
STRWui killed renamable $w8, killed renamable $x0, 1 :: (store 4 into %ir.tmp14)
|
||
|
|
||
|
bb.4.bb15:
|
||
|
renamable $w0 = COPY $wzr
|
||
|
|
||
|
bb.5.bb16:
|
||
|
liveins: $w0
|
||
|
|
||
|
RET_ReallyLR implicit $w0
|
||
|
|
||
|
...
|