diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2013-10-24 09:17:24 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2013-10-24 09:17:24 +0000 |
commit | 5e1d0d39db5fefe013f58c124a94694f96bce2f1 (patch) | |
tree | b4dcda463d9c83c54bd43c0324baf253d3f03287 /test/Instrumentation | |
parent | 2f21452ba1ee5bde8fee438b4cf1a1ce95beb6ca (diff) | |
download | external_llvm-5e1d0d39db5fefe013f58c124a94694f96bce2f1.zip external_llvm-5e1d0d39db5fefe013f58c124a94694f96bce2f1.tar.gz external_llvm-5e1d0d39db5fefe013f58c124a94694f96bce2f1.tar.bz2 |
fix PR17635: false positive with packed structures
LLVM optimizers may widen accesses to packed structures that overflow the structure itself, but should be in bounds up to the alignment of the object
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193317 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Instrumentation')
-rw-r--r-- | test/Instrumentation/BoundsChecking/simple-32.ll | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/test/Instrumentation/BoundsChecking/simple-32.ll b/test/Instrumentation/BoundsChecking/simple-32.ll new file mode 100644 index 0000000..38b210f --- /dev/null +++ b/test/Instrumentation/BoundsChecking/simple-32.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -bounds-checking -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" + +%struct.s2_packed = type <{ i64, i32, i32, i32, i16, i8 }> + +; CHECK-LABEL: @f +; CHECK-NOT: trap +define i16 @f() { +entry: + %packed1 = alloca %struct.s2_packed, align 8 + %gep = getelementptr inbounds %struct.s2_packed* %packed1, i32 0, i32 4 + %ptr = bitcast i16* %gep to i32* + %val = load i32* %ptr, align 4 + %valt = trunc i32 %val to i16 + ret i16 %valt +} + +; CHECK-LABEL: @f +; CHECK: call void @llvm.trap() +define i16 @f2() { +entry: + %packed1 = alloca %struct.s2_packed, align 8 + %gep = getelementptr inbounds %struct.s2_packed* %packed1, i32 0, i32 4 + %ptr = bitcast i16* %gep to i48* + %val = load i48* %ptr, align 4 + %valt = trunc i48 %val to i16 + ret i16 %valt +} |