Skip to content

Commit c6a3ff2

Browse files
committed
[Attributor] Check range size before constant fold load
If the range size doesn't match the type size, it might read wrong data.
1 parent 0341fb6 commit c6a3ff2

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

llvm/lib/Transforms/IPO/Attributor.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,9 @@ AA::getInitialValueForObj(Attributor &A, const AbstractAttribute &QueryingAA,
272272
}
273273

274274
if (RangePtr && !RangePtr->offsetOrSizeAreUnknown()) {
275+
int64_t StorageSize = DL.getTypeStoreSize(&Ty);
276+
if (StorageSize != RangePtr->Size)
277+
return nullptr;
275278
APInt Offset = APInt(64, RangePtr->Offset);
276279
return ConstantFoldLoadFromConst(Initializer, &Ty, Offset, DL);
277280
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt -S -passes=attributor %s -o - | FileCheck %s
3+
4+
@g = internal unnamed_addr addrspace(4) constant [3 x i8] c"12\00", align 16
5+
6+
define void @foo(i32 %a, i32 %b, ptr %p) {
7+
; CHECK-LABEL: define void @foo(
8+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], ptr nofree nonnull writeonly captures(none) dereferenceable(1) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
9+
; CHECK-NEXT: [[ENTRY:.*:]]
10+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A]], [[B]]
11+
; CHECK-NEXT: br i1 [[CMP]], label %[[L1:.*]], label %[[L2:.*]]
12+
; CHECK: [[L1]]:
13+
; CHECK-NEXT: br label %[[L3:.*]]
14+
; CHECK: [[L2]]:
15+
; CHECK-NEXT: br label %[[L3]]
16+
; CHECK: [[L3]]:
17+
; CHECK-NEXT: [[PHI:%.*]] = phi ptr addrspace(4) [ @g, %[[L1]] ], [ getelementptr inbounds nuw (i8, ptr addrspace(4) @g, i64 1), %[[L2]] ]
18+
; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(4) [[PHI]], align 1
19+
; CHECK-NEXT: store i8 [[LOAD]], ptr [[P]], align 1
20+
; CHECK-NEXT: ret void
21+
;
22+
entry:
23+
%cmp = icmp ne i32 %a, %b
24+
br i1 %cmp, label %l1, label %l2
25+
l1:
26+
br label %l3
27+
l2:
28+
br label %l3
29+
l3:
30+
%phi = phi ptr addrspace(4) [ @g, %l1 ], [ getelementptr inbounds nuw (i8, ptr addrspace(4) @g, i64 1), %l2 ]
31+
%load = load i8, ptr addrspace(4) %phi
32+
store i8 %load, ptr %p
33+
ret void
34+
}

0 commit comments

Comments
 (0)