1- ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
1+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes --version 2
22; DO NOT EDIT -- This file was generated from test/CodeGen/CHERI-Generic/Inputs/cap-from-ptr.ll
33;; Check that we can correctly generate code for llvm.cheri.cap.from.pointer()
44;; This previously asserted on RISC-V due to a broken ISel pattern.
77; RUN: opt -mtriple=mips64 -mcpu=cheri128 -mattr=+cheri128 --relocation-model=pic -target-abi purecap -passes=instcombine -S < %s | llc -mtriple=mips64 -mcpu=cheri128 -mattr=+cheri128 --relocation-model=pic -target-abi purecap | FileCheck %s --check-prefix=PURECAP
88; RUN: opt -mtriple=mips64 -mcpu=cheri128 -mattr=+cheri128 --relocation-model=pic -target-abi n64 -passes=instcombine -S < %s | llc -mtriple=mips64 -mcpu=cheri128 -mattr=+cheri128 --relocation-model=pic -target-abi n64 | FileCheck %s --check-prefix=HYBRID
99
10- define internal i8 addrspace (200 )* @test (i8 addrspace (200 )* addrspace ( 200 )* %ptr , i8 addrspace (200 )* %cap , i64 %offset ) addrspace (200 ) nounwind {
10+ define internal ptr addrspace (200 ) @test (ptr addrspace (200 ) %ptr , ptr addrspace (200 ) %cap , i64 %offset ) addrspace (200 ) nounwind {
1111; PURECAP-LABEL: test:
1212; PURECAP: # %bb.0: # %entry
1313; PURECAP-NEXT: cfromptr $c1, $c4, $4
@@ -21,21 +21,21 @@ define internal i8 addrspace(200)* @test(i8 addrspace(200)* addrspace(200)* %ptr
2121; HYBRID-NEXT: csc $c1, $zero, 0($c3)
2222; HYBRID-NEXT: jr $ra
2323; HYBRID-NEXT: cmove $c3, $c1
24- ; CHECK-IR-LABEL: define {{[^@]+}} @test
24+ ; CHECK-IR-LABEL: define internal ptr addrspace(200) @test
2525; CHECK-IR-SAME: (ptr addrspace(200) [[PTR:%.*]], ptr addrspace(200) [[CAP:%.*]], i64 [[OFFSET:%.*]]) addrspace(200) #[[ATTR0:[0-9]+]] {
2626; CHECK-IR-NEXT: entry:
2727; CHECK-IR-NEXT: [[NEW:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.from.pointer.i64(ptr addrspace(200) [[CAP]], i64 [[OFFSET]])
2828; CHECK-IR-NEXT: store ptr addrspace(200) [[NEW]], ptr addrspace(200) [[PTR]], align 16
2929; CHECK-IR-NEXT: ret ptr addrspace(200) [[NEW]]
3030;
3131entry:
32- %new = call i8 addrspace (200 )* @llvm.cheri.cap.from.pointer.i64 (i8 addrspace (200 )* %cap , i64 %offset )
33- store i8 addrspace (200 )* %new , i8 addrspace (200 )* addrspace ( 200 )* %ptr , align 16
34- ret i8 addrspace (200 )* %new
32+ %new = call ptr addrspace (200 ) @llvm.cheri.cap.from.pointer.i64 (ptr addrspace (200 ) %cap , i64 %offset )
33+ store ptr addrspace (200 ) %new , ptr addrspace (200 ) %ptr , align 16
34+ ret ptr addrspace (200 ) %new
3535}
3636
3737;; (int_cheri_cap_from_ptr x, 0) -> null
38- define internal i8 addrspace (200 )* @cap_from_ptr_zero (i8 addrspace (200 )* addrspace ( 200 )* %ptr , i8 addrspace (200 )* %cap ) addrspace ( 200 ) nounwind {
38+ define internal ptr addrspace (200 ) @cap_from_ptr_zero (ptr addrspace (200 ) %ptr , ptr addrspace (200 ) %cap ) nounwind {
3939; PURECAP-LABEL: cap_from_ptr_zero:
4040; PURECAP: # %bb.0: # %entry
4141; PURECAP-NEXT: csc $cnull, $zero, 0($c3)
@@ -47,20 +47,20 @@ define internal i8 addrspace(200)* @cap_from_ptr_zero(i8 addrspace(200)* addrspa
4747; HYBRID-NEXT: csc $cnull, $zero, 0($c3)
4848; HYBRID-NEXT: jr $ra
4949; HYBRID-NEXT: cgetnull $c3
50- ; CHECK-IR-LABEL: define {{[^@]+}} @cap_from_ptr_zero
50+ ; CHECK-IR-LABEL: define internal ptr addrspace(200) @cap_from_ptr_zero
5151; CHECK-IR-SAME: (ptr addrspace(200) [[PTR:%.*]], ptr addrspace(200) [[CAP:%.*]]) addrspace(200) #[[ATTR0]] {
5252; CHECK-IR-NEXT: entry:
5353; CHECK-IR-NEXT: store ptr addrspace(200) null, ptr addrspace(200) [[PTR]], align 16
5454; CHECK-IR-NEXT: ret ptr addrspace(200) null
5555;
5656entry:
57- %new = call i8 addrspace (200 )* @llvm.cheri.cap.from.pointer.i64 (i8 addrspace (200 )* %cap , i64 0 )
58- store i8 addrspace (200 )* %new , i8 addrspace (200 )* addrspace ( 200 )* %ptr , align 16
59- ret i8 addrspace (200 )* %new
57+ %new = call ptr addrspace (200 ) @llvm.cheri.cap.from.pointer.i64 (ptr addrspace (200 ) %cap , i64 0 )
58+ store ptr addrspace (200 ) %new , ptr addrspace (200 ) %ptr , align 16
59+ ret ptr addrspace (200 ) %new
6060}
6161
6262;; Check that (int_cheri_cap_from_ptr ddc, x) can use the DDC register directly
63- define internal i8 addrspace (200 )* @cap_from_ptr_ddc (i8 addrspace (200 )* addrspace ( 200 )* %ptr , i64 %offset ) addrspace ( 200 ) nounwind {
63+ define internal ptr addrspace (200 ) @cap_from_ptr_ddc (ptr addrspace (200 ) %ptr , i64 %offset ) nounwind {
6464; PURECAP-LABEL: cap_from_ptr_ddc:
6565; PURECAP: # %bb.0: # %entry
6666; PURECAP-NEXT: cfromddc $c1, $4
@@ -74,7 +74,7 @@ define internal i8 addrspace(200)* @cap_from_ptr_ddc(i8 addrspace(200)* addrspac
7474; HYBRID-NEXT: csc $c1, $zero, 0($c3)
7575; HYBRID-NEXT: jr $ra
7676; HYBRID-NEXT: cmove $c3, $c1
77- ; CHECK-IR-LABEL: define {{[^@]+}} @cap_from_ptr_ddc
77+ ; CHECK-IR-LABEL: define internal ptr addrspace(200) @cap_from_ptr_ddc
7878; CHECK-IR-SAME: (ptr addrspace(200) [[PTR:%.*]], i64 [[OFFSET:%.*]]) addrspace(200) #[[ATTR0]] {
7979; CHECK-IR-NEXT: entry:
8080; CHECK-IR-NEXT: [[DDC:%.*]] = call ptr addrspace(200) @llvm.cheri.ddc.get()
@@ -83,14 +83,14 @@ define internal i8 addrspace(200)* @cap_from_ptr_ddc(i8 addrspace(200)* addrspac
8383; CHECK-IR-NEXT: ret ptr addrspace(200) [[NEW]]
8484;
8585entry:
86- %ddc = call i8 addrspace (200 )* @llvm.cheri.ddc.get ()
87- %new = call i8 addrspace (200 )* @llvm.cheri.cap.from.pointer.i64 (i8 addrspace (200 )* %ddc , i64 %offset )
88- store i8 addrspace (200 )* %new , i8 addrspace (200 )* addrspace ( 200 )* %ptr , align 16
89- ret i8 addrspace (200 )* %new
86+ %ddc = call ptr addrspace (200 ) @llvm.cheri.ddc.get ()
87+ %new = call ptr addrspace (200 ) @llvm.cheri.cap.from.pointer.i64 (ptr addrspace (200 ) %ddc , i64 %offset )
88+ store ptr addrspace (200 ) %new , ptr addrspace (200 ) %ptr , align 16
89+ ret ptr addrspace (200 ) %new
9090}
9191
9292;; Check that (int_cheri_cap_from_ptr x, 0) -> null has priority over direct DDC usage
93- define internal i8 addrspace (200 )* @cap_from_ptr_ddc_zero (i8 addrspace (200 )* addrspace ( 200 )* %ptr ) addrspace ( 200 ) nounwind {
93+ define internal ptr addrspace (200 ) @cap_from_ptr_ddc_zero (ptr addrspace (200 ) %ptr ) nounwind {
9494; PURECAP-LABEL: cap_from_ptr_ddc_zero:
9595; PURECAP: # %bb.0: # %entry
9696; PURECAP-NEXT: csc $cnull, $zero, 0($c3)
@@ -102,21 +102,21 @@ define internal i8 addrspace(200)* @cap_from_ptr_ddc_zero(i8 addrspace(200)* add
102102; HYBRID-NEXT: csc $cnull, $zero, 0($c3)
103103; HYBRID-NEXT: jr $ra
104104; HYBRID-NEXT: cgetnull $c3
105- ; CHECK-IR-LABEL: define {{[^@]+}} @cap_from_ptr_ddc_zero
105+ ; CHECK-IR-LABEL: define internal ptr addrspace(200) @cap_from_ptr_ddc_zero
106106; CHECK-IR-SAME: (ptr addrspace(200) [[PTR:%.*]]) addrspace(200) #[[ATTR0]] {
107107; CHECK-IR-NEXT: entry:
108108; CHECK-IR-NEXT: store ptr addrspace(200) null, ptr addrspace(200) [[PTR]], align 16
109109; CHECK-IR-NEXT: ret ptr addrspace(200) null
110110;
111111entry:
112- %ddc = call i8 addrspace (200 )* @llvm.cheri.ddc.get ()
113- %new = call i8 addrspace (200 )* @llvm.cheri.cap.from.pointer.i64 (i8 addrspace (200 )* %ddc , i64 0 )
114- store i8 addrspace (200 )* %new , i8 addrspace (200 )* addrspace ( 200 )* %ptr , align 16
115- ret i8 addrspace (200 )* %new
112+ %ddc = call ptr addrspace (200 ) @llvm.cheri.ddc.get ()
113+ %new = call ptr addrspace (200 ) @llvm.cheri.cap.from.pointer.i64 (ptr addrspace (200 ) %ddc , i64 0 )
114+ store ptr addrspace (200 ) %new , ptr addrspace (200 ) %ptr , align 16
115+ ret ptr addrspace (200 ) %new
116116}
117117
118118;; Check that (int_cheri_cap_from_ptr null, x) does not use register zero (since that is DDC)
119- define internal i8 addrspace (200 )* @cap_from_ptr_null (i8 addrspace (200 )* addrspace ( 200 )* %ptr , i64 %offset ) addrspace ( 200 ) nounwind {
119+ define internal ptr addrspace (200 ) @cap_from_ptr_null (ptr addrspace (200 ) %ptr , i64 %offset ) nounwind {
120120; PURECAP-LABEL: cap_from_ptr_null:
121121; PURECAP: # %bb.0: # %entry
122122; PURECAP-NEXT: cgetnull $c1
@@ -132,18 +132,18 @@ define internal i8 addrspace(200)* @cap_from_ptr_null(i8 addrspace(200)* addrspa
132132; HYBRID-NEXT: csc $c1, $zero, 0($c3)
133133; HYBRID-NEXT: jr $ra
134134; HYBRID-NEXT: cmove $c3, $c1
135- ; CHECK-IR-LABEL: define {{[^@]+}} @cap_from_ptr_null
135+ ; CHECK-IR-LABEL: define internal ptr addrspace(200) @cap_from_ptr_null
136136; CHECK-IR-SAME: (ptr addrspace(200) [[PTR:%.*]], i64 [[OFFSET:%.*]]) addrspace(200) #[[ATTR0]] {
137137; CHECK-IR-NEXT: entry:
138138; CHECK-IR-NEXT: [[NEW:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.from.pointer.i64(ptr addrspace(200) null, i64 [[OFFSET]])
139139; CHECK-IR-NEXT: store ptr addrspace(200) [[NEW]], ptr addrspace(200) [[PTR]], align 16
140140; CHECK-IR-NEXT: ret ptr addrspace(200) [[NEW]]
141141;
142142entry:
143- %new = call i8 addrspace (200 )* @llvm.cheri.cap.from.pointer.i64 (i8 addrspace (200 )* null , i64 %offset )
144- store i8 addrspace (200 )* %new , i8 addrspace (200 )* addrspace ( 200 )* %ptr , align 16
145- ret i8 addrspace (200 )* %new
143+ %new = call ptr addrspace (200 ) @llvm.cheri.cap.from.pointer.i64 (ptr addrspace (200 ) null , i64 %offset )
144+ store ptr addrspace (200 ) %new , ptr addrspace (200 ) %ptr , align 16
145+ ret ptr addrspace (200 ) %new
146146}
147147
148- declare i8 addrspace (200 )* @llvm.cheri.cap.from.pointer.i64 (i8 addrspace (200 )* , i64 )
149- declare i8 addrspace (200 )* @llvm.cheri.ddc.get ()
148+ declare ptr addrspace (200 ) @llvm.cheri.cap.from.pointer.i64 (ptr addrspace (200 ), i64 )
149+ declare ptr addrspace (200 ) @llvm.cheri.ddc.get ()
0 commit comments