Skip to content

Commit d2286ce

Browse files
committed
Revert "[CHERI] Enable SCEV for CHERI pointers."
This reverts commit bab43f2, because it caused test failures in CheriotRTOS.
1 parent bab43f2 commit d2286ce

File tree

5 files changed

+57
-23
lines changed

5 files changed

+57
-23
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6296,6 +6296,12 @@ 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+
62996305
SmallVector<const SCEV *, 4> IndexExprs;
63006306
for (Value *Index : GEP->indices())
63016307
IndexExprs.push_back(getSCEV(Index));

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ 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
1617
; CHECK-NEXT: addi a0, a0, -1
1718
; CHECK-NEXT: cincoffset ca1, ca1, 4
1819
; CHECK-NEXT: bgtz a0, .LBB0_1
1920
; CHECK-NEXT: # %bb.2: # %while.end
2021
; CHECK-NEXT: csc ca1, 8(csp)
21-
; CHECK-NEXT: clw a0, -4(ca1)
22+
; CHECK-NEXT: clw a0, 0(ca2)
2223
; CHECK-NEXT: cincoffset csp, csp, 16
2324
; CHECK-NEXT: cret
2425
entry:

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ 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
1617
; CHECK-NEXT: addiw a0, a0, -1
1718
; CHECK-NEXT: cincoffset ca1, ca1, 4
1819
; CHECK-NEXT: bgtz a0, .LBB0_1
1920
; CHECK-NEXT: # %bb.2: # %while.end
2021
; CHECK-NEXT: csc ca1, 0(csp)
21-
; CHECK-NEXT: clw a0, -4(ca1)
22+
; CHECK-NEXT: clw a0, 0(ca2)
2223
; CHECK-NEXT: cincoffset csp, csp, 16
2324
; CHECK-NEXT: cret
2425
entry:
@@ -102,6 +103,7 @@ declare void @varargs(i32, ...) addrspace(200) nounwind
102103
; go in an even integer register pair and would thus reserve the odd register,
103104
; even though we're passing on the stack.
104105
define void @test_varargs_odd_cap_reg() addrspace(200) nounwind {
106+
entry:
105107
; CHECK-LABEL: test_varargs_odd_cap_reg:
106108
; CHECK: # %bb.0: # %entry
107109
; CHECK-NEXT: cincoffset csp, csp, -32
@@ -112,7 +114,6 @@ define void @test_varargs_odd_cap_reg() addrspace(200) nounwind {
112114
; CHECK-NEXT: clc cra, 16(csp) # 16-byte Folded Reload
113115
; CHECK-NEXT: cincoffset csp, csp, 32
114116
; CHECK-NEXT: cret
115-
entry:
116117
tail call void (i32, ...) @varargs(i32 1, ptr addrspace(200) null)
117118
ret void
118119
}

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

Lines changed: 23 additions & 17 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
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --force-update
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,22 +32,25 @@ 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: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16
35+
; HYBRID-NEXT: [[UGLYGEP:%.*]] = 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 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR2:[0-9]+]]
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]+]]
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_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]]
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]]
5154
; PURECAP: bb2:
5255
; PURECAP-NEXT: ret void
5356
;
@@ -79,22 +82,25 @@ define void @must_preserve(ptr addrspace("A") noalias writeonly %dst, ptr addrsp
7982
; HYBRID-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0
8083
; HYBRID-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]]
8184
; HYBRID: bb1.preheader:
82-
; HYBRID-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16
85+
; HYBRID-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16
8386
; HYBRID-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4
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]+]]
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]+]]
8588
; HYBRID-NEXT: br label [[BB2]]
8689
; HYBRID: bb2:
8790
; HYBRID-NEXT: ret void
8891
;
8992
; PURECAP-LABEL: define {{[^@]+}}@must_preserve
9093
; PURECAP-SAME: (ptr addrspace(200) noalias writeonly [[DST:%.*]], ptr addrspace(200) noalias readonly [[SRC:%.*]], i64 [[COUNT:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0]] {
9194
; PURECAP-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0
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]]
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]]
98104
; PURECAP: bb2:
99105
; PURECAP-NEXT: ret void
100106
;

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

Lines changed: 23 additions & 3 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
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --force-update
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,7 +24,17 @@ 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: 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]+]]
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:
2838
; PURECAP-NEXT: ret void
2939
;
3040
entry:
@@ -57,7 +67,17 @@ define void @get_cap_state(ptr addrspace("A") nocapture noalias %state) addrspac
5767
; PURECAP-LABEL: define {{[^@]+}}@get_cap_state
5868
; PURECAP-SAME: (ptr addrspace(200) noalias nocapture [[STATE:%.*]]) addrspace(200) {
5969
; PURECAP-NEXT: entry:
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]+]]
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:
6181
; PURECAP-NEXT: ret void
6282
;
6383
entry:

0 commit comments

Comments
 (0)