Skip to content

Commit 765a44e

Browse files
committed
Verify bitcast does not contain address space conversion
1 parent e446b47 commit 765a44e

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

clang/lib/CIR/Dialect/IR/CIRDialect.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,10 @@ LogicalResult cir::CastOp::verify() {
423423
auto resPtrTy = mlir::dyn_cast<cir::PointerType>(resType);
424424

425425
if (srcPtrTy && resPtrTy) {
426-
return success();
426+
if (srcPtrTy.getAddrSpace() != resPtrTy.getAddrSpace()) {
427+
return emitOpError() << "result type address space does not match the "
428+
"address space of the operand";
429+
}
427430
}
428431

429432
return success();

clang/test/CIR/IR/invalid-addrspace.cir

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,40 @@ cir.func @address_space3(%p : !cir.ptr<!u64i, addrspace(target)>) {
3434
cir.func @address_space4(%p : !cir.ptr<!u64i, addrspace(foobar)>) {
3535
cir.return
3636
}
37+
38+
// -----
39+
40+
!u32i = !cir.int<u, 32>
41+
!u64i = !cir.int<u, 64>
42+
cir.func @cast25(%p : !cir.ptr<!u32i, addrspace(target<1>)>) {
43+
%0 = cir.cast(address_space, %p : !cir.ptr<!u32i, addrspace(target<1>)>), !cir.ptr<!u64i, addrspace(target<2>)> // expected-error {{requires two types differ in addrspace only}}
44+
cir.return
45+
}
46+
47+
// -----
48+
49+
!u64i = !cir.int<u, 64>
50+
cir.func @cast26(%p : !cir.ptr<!u64i, addrspace(target<1>)>) {
51+
%0 = cir.cast(address_space, %p : !cir.ptr<!u64i, addrspace(target<1>)>), !u64i // expected-error {{requires !cir.ptr type for source and result}}
52+
cir.return
53+
}
54+
55+
// -----
56+
57+
!u64i = !cir.int<u, 64>
58+
cir.func @cast27(%p : !u64i) {
59+
%0 = cir.cast(address_space, %p : !u64i), !cir.ptr<!u64i, addrspace(target<1>)> // expected-error {{requires !cir.ptr type for source and result}}
60+
cir.return
61+
}
62+
63+
// -----
64+
65+
!s32i = !cir.int<s, 32>
66+
67+
module {
68+
cir.func @test_bitcast_addrspace() {
69+
%0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["tmp"] {alignment = 4 : i64}
70+
// expected-error@+1 {{'cir.cast' op result type address space does not match the address space of the operand}}
71+
%1 = cir.cast(bitcast, %0 : !cir.ptr<!s32i>), !cir.ptr<!s32i, addrspace(offload_local)>
72+
}
73+
}

0 commit comments

Comments
 (0)