|
| 1 | +// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir |
| 2 | +// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR |
| 3 | +// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll |
| 4 | +// RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM |
| 5 | +// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll |
| 6 | +// RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG |
| 7 | + |
| 8 | +using pi1_t = int __attribute__((address_space(1))) *; |
| 9 | +using pi2_t = int __attribute__((address_space(2))) *; |
| 10 | + |
| 11 | +using ri1_t = int __attribute__((address_space(1))) &; |
| 12 | +using ri2_t = int __attribute__((address_space(2))) &; |
| 13 | + |
| 14 | +// CIR: cir.func dso_local @{{.*test_ptr.*}} |
| 15 | +// LLVM: define dso_local void @{{.*test_ptr.*}} |
| 16 | +// OGCG: define dso_local void @{{.*test_ptr.*}} |
| 17 | +void test_ptr() { |
| 18 | + pi1_t ptr1; |
| 19 | + pi2_t ptr2 = (pi2_t)ptr1; |
| 20 | + // CIR: %[[#PTR1:]] = cir.load{{.*}} %{{[0-9]+}} : !cir.ptr<!cir.ptr<!s32 |
| 21 | + // CIR-NEXT: %[[#CAST:]] = cir.cast(address_space, %[[#PTR1]] : !cir.ptr<!s32i, addrspace(target<1>)>), !cir.ptr<!s32i, addrspace(target<2>)> |
| 22 | + // CIR-NEXT: cir.store{{.*}} %[[#CAST]], %{{[0-9]+}} : !cir.ptr<!s32i, addrspace(target<2>)>, !cir.ptr<!cir.ptr<!s32i, addrspace(target<2>)>> |
| 23 | + |
| 24 | + // LLVM: %[[#PTR1:]] = load ptr addrspace(1), ptr %{{[0-9]+}}, align 8 |
| 25 | + // LLVM-NEXT: %[[#CAST:]] = addrspacecast ptr addrspace(1) %[[#PTR1]] to ptr addrspace(2) |
| 26 | + // LLVM-NEXT: store ptr addrspace(2) %[[#CAST]], ptr %{{[0-9]+}}, align 8 |
| 27 | + |
| 28 | + // OGCG: %{{.*}} = load ptr addrspace(1), ptr %{{.*}}, align 8 |
| 29 | + // OGCG-NEXT: %{{.*}} = addrspacecast ptr addrspace(1) %{{.*}} to ptr addrspace(2) |
| 30 | + // OGCG-NEXT: store ptr addrspace(2) %{{.*}}, ptr %{{.*}}, align 8 |
| 31 | +} |
| 32 | + |
| 33 | +// CIR: cir.func dso_local @{{.*test_ref.*}} |
| 34 | +// LLVM: define dso_local void @{{.*test_ref.*}} |
| 35 | +// OGCG: define dso_local void @{{.*test_ref.*}} |
| 36 | +void test_ref() { |
| 37 | + pi1_t ptr; |
| 38 | + ri1_t ref1 = *ptr; |
| 39 | + ri2_t ref2 = (ri2_t)ref1; |
| 40 | + // CIR: %[[#DEREF:]] = cir.load deref{{.*}} %{{[0-9]+}} : !cir.ptr<!cir.ptr<!s32i, addrspace(target<1>)>>, !cir.ptr<!s32i, addrspace(target<1>)> |
| 41 | + // CIR-NEXT: cir.store{{.*}} %[[#DEREF]], %[[#ALLOCAREF1:]] : !cir.ptr<!s32i, addrspace(target<1>)>, !cir.ptr<!cir.ptr<!s32i, addrspace(target<1>)>> |
| 42 | + // CIR-NEXT: %[[#REF1:]] = cir.load{{.*}} %[[#ALLOCAREF1]] : !cir.ptr<!cir.ptr<!s32i, addrspace(target<1>)>>, !cir.ptr<!s32i, addrspace(target<1>)> |
| 43 | + // CIR-NEXT: %[[#CAST:]] = cir.cast(address_space, %[[#REF1]] : !cir.ptr<!s32i, addrspace(target<1>)>), !cir.ptr<!s32i, addrspace(target<2>)> |
| 44 | + // CIR-NEXT: cir.store{{.*}} %[[#CAST]], %{{[0-9]+}} : !cir.ptr<!s32i, addrspace(target<2>)>, !cir.ptr<!cir.ptr<!s32i, addrspace(target<2>)>> |
| 45 | + |
| 46 | + // LLVM: %[[#DEREF:]] = load ptr addrspace(1), ptr %{{[0-9]+}}, align 8 |
| 47 | + // LLVM-NEXT: store ptr addrspace(1) %[[#DEREF]], ptr %[[#ALLOCAREF1:]], align 8 |
| 48 | + // LLVM-NEXT: %[[#REF1:]] = load ptr addrspace(1), ptr %[[#ALLOCAREF1]], align 8 |
| 49 | + // LLVM-NEXT: %[[#CAST:]] = addrspacecast ptr addrspace(1) %[[#REF1]] to ptr addrspace(2) |
| 50 | + // LLVM-NEXT: store ptr addrspace(2) %[[#CAST]], ptr %{{[0-9]+}}, align 8 |
| 51 | + |
| 52 | + // OGCG: %{{.*}} = load ptr addrspace(1), ptr %{{.*}}, align 8 |
| 53 | + // OGCG-NEXT: store ptr addrspace(1) %{{.*}}, ptr %{{.*}}, align 8 |
| 54 | + // OGCG-NEXT: %{{.*}} = load ptr addrspace(1), ptr %{{.*}}, align 8 |
| 55 | + // OGCG-NEXT: %{{.*}} = addrspacecast ptr addrspace(1) %{{.*}} to ptr addrspace(2) |
| 56 | + // OGCG-NEXT: store ptr addrspace(2) %{{.*}}, ptr %{{.*}}, align 8 |
| 57 | +} |
| 58 | + |
| 59 | +// CIR: cir.func dso_local @{{.*test_nullptr.*}} |
| 60 | +// LLVM: define dso_local void @{{.*test_nullptr.*}} |
| 61 | +// OGCG: define dso_local void @{{.*test_nullptr.*}} |
| 62 | +void test_nullptr() { |
| 63 | + constexpr pi1_t null1 = nullptr; |
| 64 | + pi2_t ptr = (pi2_t)null1; |
| 65 | + // CIR: %[[#NULL1:]] = cir.const #cir.ptr<null> : !cir.ptr<!s32i, addrspace(target<1>)> |
| 66 | + // CIR-NEXT: cir.store{{.*}} %[[#NULL1]], %{{[0-9]+}} : !cir.ptr<!s32i, addrspace(target<1>)>, !cir.ptr<!cir.ptr<!s32i, addrspace(target<1>)>> |
| 67 | + // CIR-NEXT: %[[#NULL2:]] = cir.const #cir.ptr<null> : !cir.ptr<!s32i, addrspace(target<2>)> |
| 68 | + // CIR-NEXT: cir.store{{.*}} %[[#NULL2]], %{{[0-9]+}} : !cir.ptr<!s32i, addrspace(target<2>)>, !cir.ptr<!cir.ptr<!s32i, addrspace(target<2>)>> |
| 69 | + |
| 70 | + // LLVM: store ptr addrspace(1) null, ptr %{{[0-9]+}}, align 8 |
| 71 | + // LLVM-NEXT: store ptr addrspace(2) null, ptr %{{[0-9]+}}, align 8 |
| 72 | + |
| 73 | + // OGCG: store ptr addrspace(1) null, ptr %{{.*}}, align 8 |
| 74 | + // OGCG-NEXT: store ptr addrspace(2) null, ptr %{{.*}}, align 8 |
| 75 | +} |
| 76 | + |
| 77 | +void test_side_effect(pi1_t b) { |
| 78 | + pi2_t p = (pi2_t)(*b++, (int*)0); |
| 79 | + // CIR: %{{[0-9]+}} = cir.ptr_stride(%{{[0-9]+}} : !cir.ptr<!s32i, addrspace(target<1>)>, %{{[0-9]+}} : !s32i), !cir.ptr<!s32i, addrspace(target<1>)> |
| 80 | + // CIR: %[[#CAST:]] = cir.const #cir.ptr<null> : !cir.ptr<!s32i, addrspace(target<2>)> |
| 81 | + // CIR-NEXT: cir.store{{.*}} %[[#CAST]], %{{[0-9]+}} : !cir.ptr<!s32i, addrspace(target<2>)>, !cir.ptr<!cir.ptr<!s32i, addrspace(target<2>)>> |
| 82 | + |
| 83 | + // LLVM: %{{[0-9]+}} = getelementptr i32, ptr addrspace(1) %{{[0-9]+}}, i64 1 |
| 84 | + // LLVM: store ptr addrspace(2) null, ptr %{{[0-9]+}}, align 8 |
| 85 | + |
| 86 | + // OGCG: %{{.*}} = getelementptr{{.*}} i32, ptr addrspace(1) %{{.*}}, i32 1 |
| 87 | + // OGCG: store ptr addrspace(2) null, ptr %{{.*}}, align 8 |
| 88 | + |
| 89 | +} |
0 commit comments