Skip to content

Commit 522ef0b

Browse files
committed
[CHERI] Enable SCEV for CHERI pointers.
Per communication with CHERI upstream, this is expected to work at this point.
1 parent e69c5d7 commit 522ef0b

File tree

5 files changed

+23
-57
lines changed

5 files changed

+23
-57
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6296,12 +6296,6 @@ const SCEV *ScalarEvolution::createNodeForGEP(GEPOperator *GEP) {
62966296
assert(GEP->getSourceElementType()->isSized() &&
62976297
"GEP source element type must be sized");
62986298

6299-
const DataLayout &DL = F.getParent()->getDataLayout();
6300-
// FIXME: Ideally, we should teach Scalar Evolution to
6301-
// understand fat pointers.
6302-
if (DL.isFatPointer(GEP->getPointerOperandType()->getPointerAddressSpace()))
6303-
return getUnknown(GEP);
6304-
63056299
SmallVector<const SCEV *, 4> IndexExprs;
63066300
for (Value *Index : GEP->indices())
63076301
IndexExprs.push_back(getSCEV(Index));

llvm/test/CodeGen/RISCV/cheri/calling-conv-il32pc64.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@ define i32 @get_ith_word(i32 signext %i, ...) addrspace(200) nounwind {
1313
; CHECK-NEXT: addi a0, a0, 1
1414
; CHECK-NEXT: .LBB0_1: # %while.cond
1515
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
16-
; CHECK-NEXT: cmove ca2, ca1
1716
; CHECK-NEXT: addi a0, a0, -1
1817
; CHECK-NEXT: cincoffset ca1, ca1, 4
1918
; CHECK-NEXT: bgtz a0, .LBB0_1
2019
; CHECK-NEXT: # %bb.2: # %while.end
2120
; CHECK-NEXT: csc ca1, 8(csp)
22-
; CHECK-NEXT: clw a0, 0(ca2)
21+
; CHECK-NEXT: clw a0, -4(ca1)
2322
; CHECK-NEXT: cincoffset csp, csp, 16
2423
; CHECK-NEXT: cret
2524
entry:

llvm/test/CodeGen/RISCV/cheri/calling-conv-l64pc128.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@ define i32 @get_ith_word(i32 signext %i, ...) addrspace(200) nounwind {
1313
; CHECK-NEXT: addi a0, a0, 1
1414
; CHECK-NEXT: .LBB0_1: # %while.cond
1515
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
16-
; CHECK-NEXT: cmove ca2, ca1
1716
; CHECK-NEXT: addiw a0, a0, -1
1817
; CHECK-NEXT: cincoffset ca1, ca1, 4
1918
; CHECK-NEXT: bgtz a0, .LBB0_1
2019
; CHECK-NEXT: # %bb.2: # %while.end
2120
; CHECK-NEXT: csc ca1, 0(csp)
22-
; CHECK-NEXT: clw a0, 0(ca2)
21+
; CHECK-NEXT: clw a0, -4(ca1)
2322
; CHECK-NEXT: cincoffset csp, csp, 16
2423
; CHECK-NEXT: cret
2524
entry:
@@ -103,7 +102,6 @@ declare void @varargs(i32, ...) addrspace(200) nounwind
103102
; go in an even integer register pair and would thus reserve the odd register,
104103
; even though we're passing on the stack.
105104
define void @test_varargs_odd_cap_reg() addrspace(200) nounwind {
106-
entry:
107105
; CHECK-LABEL: test_varargs_odd_cap_reg:
108106
; CHECK: # %bb.0: # %entry
109107
; CHECK-NEXT: cincoffset csp, csp, -32
@@ -114,6 +112,7 @@ entry:
114112
; CHECK-NEXT: clc cra, 16(csp) # 16-byte Folded Reload
115113
; CHECK-NEXT: cincoffset csp, csp, 32
116114
; CHECK-NEXT: cret
115+
entry:
117116
tail call void (i32, ...) @varargs(i32 1, ptr addrspace(200) null)
118117
ret void
119118
}

llvm/test/Transforms/LoopIdiom/cheri-preserve-tags-memcpy.ll

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --force-update
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
22
; Check that we retain the {must,no}_preserve_cheri_tags attribute when merging memcpy loops.
33
; FIXME: this does not work as expected with addrspace(200) pointers yet since we need SCEV.
44
; RUN: sed -e 's/-A200-P200-G200//g' -e 's/.p200/.p0/g' %s | \
@@ -32,25 +32,22 @@ define void @no_preserve(ptr addrspace("A") noalias writeonly %dst, ptr addrspac
3232
; HYBRID-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0
3333
; HYBRID-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]]
3434
; HYBRID: bb1.preheader:
35-
; HYBRID-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16
35+
; HYBRID-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16
3636
; HYBRID-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4
37-
; HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DST]], ptr align 4 [[UGLYGEP]], i64 [[TMP1]], i1 false) #[[ATTR2:[0-9]+]]
37+
; HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DST]], ptr align 4 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR2:[0-9]+]]
3838
; HYBRID-NEXT: br label [[BB2]]
3939
; HYBRID: bb2:
4040
; HYBRID-NEXT: ret void
4141
;
4242
; PURECAP-LABEL: define {{[^@]+}}@no_preserve
4343
; PURECAP-SAME: (ptr addrspace(200) noalias writeonly [[DST:%.*]], ptr addrspace(200) noalias readonly [[SRC:%.*]], i64 [[COUNT:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0:[0-9]+]] {
4444
; PURECAP-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0
45-
; PURECAP-NEXT: br i1 [[CMP1]], label [[BB1:%.*]], label [[BB2:%.*]]
46-
; PURECAP: bb1:
47-
; PURECAP-NEXT: [[IDX:%.*]] = phi i64 [ [[ADD:%.*]], [[BB1]] ], [ 0, [[TMP0:%.*]] ]
48-
; PURECAP-NEXT: [[LDST:%.*]] = getelementptr [[STRUCT_WOMBAT:%.*]], ptr addrspace(200) [[DST]], i64 [[IDX]]
49-
; PURECAP-NEXT: [[ADD]] = add nuw nsw i64 [[IDX]], 1
50-
; PURECAP-NEXT: [[LSRC:%.*]] = getelementptr [[STRUCT_WOMBAT]], ptr addrspace(200) [[SRC]], i64 [[ADD]]
51-
; PURECAP-NEXT: tail call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) noundef nonnull align 16 dereferenceable(16) [[LDST]], ptr addrspace(200) noundef nonnull align 4 dereferenceable(16) [[LSRC]], i64 16, i1 false) #[[ATTR2:[0-9]+]]
52-
; PURECAP-NEXT: [[CMP2:%.*]] = icmp slt i64 [[ADD]], [[COUNT]]
53-
; PURECAP-NEXT: br i1 [[CMP2]], label [[BB1]], label [[BB2]]
45+
; PURECAP-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]]
46+
; PURECAP: bb1.preheader:
47+
; PURECAP-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(200) [[SRC]], i64 16
48+
; PURECAP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4
49+
; PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[DST]], ptr addrspace(200) align 4 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR2:[0-9]+]]
50+
; PURECAP-NEXT: br label [[BB2]]
5451
; PURECAP: bb2:
5552
; PURECAP-NEXT: ret void
5653
;
@@ -82,25 +79,22 @@ define void @must_preserve(ptr addrspace("A") noalias writeonly %dst, ptr addrsp
8279
; HYBRID-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0
8380
; HYBRID-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]]
8481
; HYBRID: bb1.preheader:
85-
; HYBRID-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16
82+
; HYBRID-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16
8683
; HYBRID-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4
87-
; HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DST]], ptr align 4 [[UGLYGEP]], i64 [[TMP1]], i1 false) #[[ATTR3:[0-9]+]]
84+
; HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DST]], ptr align 4 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR3:[0-9]+]]
8885
; HYBRID-NEXT: br label [[BB2]]
8986
; HYBRID: bb2:
9087
; HYBRID-NEXT: ret void
9188
;
9289
; PURECAP-LABEL: define {{[^@]+}}@must_preserve
9390
; PURECAP-SAME: (ptr addrspace(200) noalias writeonly [[DST:%.*]], ptr addrspace(200) noalias readonly [[SRC:%.*]], i64 [[COUNT:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0]] {
9491
; PURECAP-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0
95-
; PURECAP-NEXT: br i1 [[CMP1]], label [[BB1:%.*]], label [[BB2:%.*]]
96-
; PURECAP: bb1:
97-
; PURECAP-NEXT: [[IDX:%.*]] = phi i64 [ [[ADD:%.*]], [[BB1]] ], [ 0, [[TMP0:%.*]] ]
98-
; PURECAP-NEXT: [[LDST:%.*]] = getelementptr [[STRUCT_WOMBAT:%.*]], ptr addrspace(200) [[DST]], i64 [[IDX]]
99-
; PURECAP-NEXT: [[ADD]] = add nuw nsw i64 [[IDX]], 1
100-
; PURECAP-NEXT: [[LSRC:%.*]] = getelementptr [[STRUCT_WOMBAT]], ptr addrspace(200) [[SRC]], i64 [[ADD]]
101-
; PURECAP-NEXT: tail call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) noundef nonnull align 16 dereferenceable(16) [[LDST]], ptr addrspace(200) noundef nonnull align 4 dereferenceable(16) [[LSRC]], i64 16, i1 false) #[[ATTR3:[0-9]+]]
102-
; PURECAP-NEXT: [[CMP2:%.*]] = icmp slt i64 [[ADD]], [[COUNT]]
103-
; PURECAP-NEXT: br i1 [[CMP2]], label [[BB1]], label [[BB2]]
92+
; PURECAP-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]]
93+
; PURECAP: bb1.preheader:
94+
; PURECAP-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(200) [[SRC]], i64 16
95+
; PURECAP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4
96+
; PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[DST]], ptr addrspace(200) align 4 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR3:[0-9]+]]
97+
; PURECAP-NEXT: br label [[BB2]]
10498
; PURECAP: bb2:
10599
; PURECAP-NEXT: ret void
106100
;

llvm/test/Transforms/LoopIdiom/cheri-preserve-tags-store.ll

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --force-update
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
22
; We should be setting no_preserve_cheri_tags for loops that copy integers, and must_preserve_cheri_tags for capability copies.
33
; FIXME: this does not work with addrspace(200) pointers yet since we need SCEV.
44
; RUN: sed -e 's/-A200-P200-G200//g' %s | opt --passes='require<aa>,loop(loop-idiom,loop-deletion),simplifycfg' -aa-pipeline=basic-aa -S | \
@@ -24,17 +24,7 @@ define void @get_state(ptr addrspace("A") nocapture noalias %state) addrspace("P
2424
; PURECAP-LABEL: define {{[^@]+}}@get_state
2525
; PURECAP-SAME: (ptr addrspace(200) noalias nocapture [[STATE:%.*]]) addrspace(200) {
2626
; PURECAP-NEXT: entry:
27-
; PURECAP-NEXT: br label [[FOR_BODY:%.*]]
28-
; PURECAP: for.body:
29-
; PURECAP-NEXT: [[I_08:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
30-
; PURECAP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [25 x i32], ptr addrspace(200) @nocap, i64 0, i64 [[I_08]]
31-
; PURECAP-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(200) [[ARRAYIDX]], align 4
32-
; PURECAP-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds [[STRUCT_STATE:%.*]], ptr addrspace(200) [[STATE]], i64 0, i32 0, i64 [[I_08]]
33-
; PURECAP-NEXT: store i32 [[TMP0]], ptr addrspace(200) [[ARRAYIDX2]], align 4
34-
; PURECAP-NEXT: [[INC]] = add nuw nsw i64 [[I_08]], 1
35-
; PURECAP-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INC]], 25
36-
; PURECAP-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END:%.*]]
37-
; PURECAP: for.end:
27+
; PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 4 [[STATE]], ptr addrspace(200) align 4 @nocap, i64 100, i1 false) #[[ATTR1:[0-9]+]]
3828
; PURECAP-NEXT: ret void
3929
;
4030
entry:
@@ -67,17 +57,7 @@ define void @get_cap_state(ptr addrspace("A") nocapture noalias %state) addrspac
6757
; PURECAP-LABEL: define {{[^@]+}}@get_cap_state
6858
; PURECAP-SAME: (ptr addrspace(200) noalias nocapture [[STATE:%.*]]) addrspace(200) {
6959
; PURECAP-NEXT: entry:
70-
; PURECAP-NEXT: br label [[FOR_BODY:%.*]]
71-
; PURECAP: for.body:
72-
; PURECAP-NEXT: [[I_08:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
73-
; PURECAP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [25 x ptr addrspace(200)], ptr addrspace(200) @cap, i64 0, i64 [[I_08]]
74-
; PURECAP-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr addrspace(200) [[ARRAYIDX]], align 16
75-
; PURECAP-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds [[STRUCT_CAPSTATE:%.*]], ptr addrspace(200) [[STATE]], i64 0, i32 0, i64 [[I_08]]
76-
; PURECAP-NEXT: store ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[ARRAYIDX2]], align 16
77-
; PURECAP-NEXT: [[INC]] = add nuw nsw i64 [[I_08]], 1
78-
; PURECAP-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INC]], 25
79-
; PURECAP-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END:%.*]]
80-
; PURECAP: for.end:
60+
; PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[STATE]], ptr addrspace(200) align 16 @cap, i64 400, i1 false) #[[ATTR2:[0-9]+]]
8161
; PURECAP-NEXT: ret void
8262
;
8363
entry:

0 commit comments

Comments
 (0)