1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[StackSafety,NFC] Extract addOverflowNever

This commit is contained in:
Vitaly Buka 2020-06-12 17:41:28 -07:00
parent c7d09d1011
commit ee47bd7b36
3 changed files with 35 additions and 8 deletions

View File

@ -98,6 +98,13 @@ bool isUnsafe(const ConstantRange &R) {
return R.isEmptySet() || R.isFullSet() || R.isUpperSignWrapped();
}
ConstantRange addOverflowNever(const ConstantRange &L, const ConstantRange &R) {
if (L.signedAddMayOverflow(R) !=
ConstantRange::OverflowResult::NeverOverflows)
return ConstantRange(L.getBitWidth(), true);
return L.add(R);
}
/// Calculate the allocation size of a given alloca. Returns empty range
// in case of confution.
ConstantRange getStaticAllocaSizeRange(const AllocaInst &AI) {
@ -237,10 +244,7 @@ StackSafetyLocalAnalysis::getAccessRange(Value *Addr, Value *Base,
if (isUnsafe(Offsets))
return UnknownRange;
if (Offsets.signedAddMayOverflow(SizeRange) !=
ConstantRange::OverflowResult::NeverOverflows)
return UnknownRange;
Offsets = Offsets.add(SizeRange);
Offsets = addOverflowNever(Offsets, SizeRange);
if (isUnsafe(Offsets))
return UnknownRange;
return Offsets;
@ -453,10 +457,7 @@ ConstantRange StackSafetyDataFlowAnalysis<CalleeTy>::getArgumentAccessRange(
return Access;
if (Access.isFullSet())
return UnknownRange;
if (Offsets.signedAddMayOverflow(Access) !=
ConstantRange::OverflowResult::NeverOverflows)
return UnknownRange;
return Access.add(Offsets);
return addOverflowNever(Access, Offsets);
}
template <typename CalleeTy>

View File

@ -460,3 +460,28 @@ entry:
call void @ByValArray([100000 x i64]* byval %z3)
ret void
}
define dso_local i8 @LoadMinInt64(i8* %p) {
; CHECK-LABEL: @LoadMinInt64{{$}}
; CHECK-NEXT: args uses:
; CHECK-NEXT: p[]: [-9223372036854775808,-9223372036854775807){{$}}
; CHECK-NEXT: allocas uses:
; CHECK-NOT: ]:
%p2 = getelementptr i8, i8* %p, i64 -9223372036854775808
%v = load i8, i8* %p2, align 1
ret i8 %v
}
define void @Overflow() {
; CHECK-LABEL: @Overflow dso_preemptable{{$}}
; CHECK-NEXT: args uses:
; CHECK-NEXT: allocas uses:
; LOCAL: x[1]: empty-set, @LoadMinInt64(arg0, [-9223372036854775808,-9223372036854775807)){{$}}
; GLOBAL: x[1]: full-set, @LoadMinInt64(arg0, [-9223372036854775808,-9223372036854775807)){{$}}
; CHECK-NOT: ]:
entry:
%x = alloca i8, align 4
%x2 = getelementptr i8, i8* %x, i64 -9223372036854775808
%v = call i8 @LoadMinInt64(i8* %x2)
ret void
}

View File

@ -6,6 +6,7 @@
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
declare void @llvm.memset.p0i8.i64(i8* %dest, i8 %val, i64 %len, i1 %isvolatile)
declare void @llvm.memset.p0i8.i32(i8* %dest, i8 %val, i32 %len, i1 %isvolatile)
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i1 %isvolatile)
declare void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i1 %isvolatile)