Skip to content

Commit 93afd8f

Browse files
authored
[CIR] Upstream support for type aliases (#131912)
CIR uses aliases for standard integer types and void. This change adds upstream support for those aliases and updates existing tests.
1 parent 01d28c1 commit 93afd8f

20 files changed

+407
-397
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,20 @@ struct CIROpAsmDialectInterface : public OpAsmDialectInterface {
3131
using OpAsmDialectInterface::OpAsmDialectInterface;
3232

3333
AliasResult getAlias(Type type, raw_ostream &os) const final {
34+
if (auto intType = dyn_cast<cir::IntType>(type)) {
35+
// We only provide alias for standard integer types (i.e. integer types
36+
// whose width is a power of 2 and at least 8).
37+
unsigned width = intType.getWidth();
38+
if (width < 8 || !llvm::isPowerOf2_32(width))
39+
return AliasResult::NoAlias;
40+
os << intType.getAlias();
41+
return AliasResult::OverridableAlias;
42+
}
43+
if (auto voidType = dyn_cast<cir::VoidType>(type)) {
44+
os << voidType.getAlias();
45+
return AliasResult::OverridableAlias;
46+
}
47+
3448
return AliasResult::NoAlias;
3549
}
3650

clang/test/CIR/CodeGen/array.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,41 @@
11
// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o - 2>&1 | FileCheck %s
22

33
int a[10];
4-
// CHECK: cir.global external @a : !cir.array<!cir.int<s, 32> x 10>
4+
// CHECK: cir.global external @a : !cir.array<!s32i x 10>
55

66
int aa[10][5];
7-
// CHECK: cir.global external @aa : !cir.array<!cir.array<!cir.int<s, 32> x 5> x 10>
7+
// CHECK: cir.global external @aa : !cir.array<!cir.array<!s32i x 5> x 10>
88

99
extern int b[10];
10-
// CHECK: cir.global external @b : !cir.array<!cir.int<s, 32> x 10>
10+
// CHECK: cir.global external @b : !cir.array<!s32i x 10>
1111

1212
extern int bb[10][5];
13-
// CHECK: cir.global external @bb : !cir.array<!cir.array<!cir.int<s, 32> x 5> x 10>
13+
// CHECK: cir.global external @bb : !cir.array<!cir.array<!s32i x 5> x 10>
1414

1515
int c[10] = {};
16-
// CHECK: cir.global external @c = #cir.zero : !cir.array<!cir.int<s, 32> x 10>
16+
// CHECK: cir.global external @c = #cir.zero : !cir.array<!s32i x 10>
1717

1818
int d[3] = {1, 2, 3};
19-
// CHECK: cir.global external @d = #cir.const_array<[#cir.int<1> : !cir.int<s, 32>, #cir.int<2> : !cir.int<s, 32>, #cir.int<3> : !cir.int<s, 32>]> : !cir.array<!cir.int<s, 32> x 3>
19+
// CHECK: cir.global external @d = #cir.const_array<[#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i]> : !cir.array<!s32i x 3>
2020

2121
int dd[3][2] = {{1, 2}, {3, 4}, {5, 6}};
22-
// CHECK: cir.global external @dd = #cir.const_array<[#cir.const_array<[#cir.int<1> : !cir.int<s, 32>, #cir.int<2> : !cir.int<s, 32>]> : !cir.array<!cir.int<s, 32> x 2>, #cir.const_array<[#cir.int<3> : !cir.int<s, 32>, #cir.int<4> : !cir.int<s, 32>]> : !cir.array<!cir.int<s, 32> x 2>, #cir.const_array<[#cir.int<5> : !cir.int<s, 32>, #cir.int<6> : !cir.int<s, 32>]> : !cir.array<!cir.int<s, 32> x 2>]> : !cir.array<!cir.array<!cir.int<s, 32> x 2> x 3>
22+
// CHECK: cir.global external @dd = #cir.const_array<[#cir.const_array<[#cir.int<1> : !s32i, #cir.int<2> : !s32i]> : !cir.array<!s32i x 2>, #cir.const_array<[#cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.array<!s32i x 2>, #cir.const_array<[#cir.int<5> : !s32i, #cir.int<6> : !s32i]> : !cir.array<!s32i x 2>]> : !cir.array<!cir.array<!s32i x 2> x 3>
2323

2424
int e[10] = {1, 2};
25-
// CHECK: cir.global external @e = #cir.const_array<[#cir.int<1> : !cir.int<s, 32>, #cir.int<2> : !cir.int<s, 32>], trailing_zeros> : !cir.array<!cir.int<s, 32> x 10>
25+
// CHECK: cir.global external @e = #cir.const_array<[#cir.int<1> : !s32i, #cir.int<2> : !s32i], trailing_zeros> : !cir.array<!s32i x 10>
2626

2727
int f[5] = {1, 2};
28-
// CHECK: cir.global external @f = #cir.const_array<[#cir.int<1> : !cir.int<s, 32>, #cir.int<2> : !cir.int<s, 32>, #cir.int<0> : !cir.int<s, 32>, #cir.int<0> : !cir.int<s, 32>, #cir.int<0> : !cir.int<s, 32>]> : !cir.array<!cir.int<s, 32> x 5>
28+
// CHECK: cir.global external @f = #cir.const_array<[#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.array<!s32i x 5>
2929

3030
void func() {
3131
int l[10];
32-
// CHECK: %[[ARR:.*]] = cir.alloca !cir.array<!cir.int<s, 32> x 10>, !cir.ptr<!cir.array<!cir.int<s, 32> x 10>>, ["l"]
32+
// CHECK: %[[ARR:.*]] = cir.alloca !cir.array<!s32i x 10>, !cir.ptr<!cir.array<!s32i x 10>>, ["l"]
3333
}
3434

3535
void func2(int p[10]) {}
36-
// CHECK: cir.func @func2(%arg0: !cir.ptr<!cir.int<s, 32>>
37-
// CHECK: cir.alloca !cir.ptr<!cir.int<s, 32>>, !cir.ptr<!cir.ptr<!cir.int<s, 32>>>, ["p", init]
36+
// CHECK: cir.func @func2(%arg0: !cir.ptr<!s32i>
37+
// CHECK: cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["p", init]
3838

3939
void func3(int pp[10][5]) {}
40-
// CHECK: cir.func @func3(%arg0: !cir.ptr<!cir.array<!cir.int<s, 32> x 5>>
41-
// CHECK: cir.alloca !cir.ptr<!cir.array<!cir.int<s, 32> x 5>>, !cir.ptr<!cir.ptr<!cir.array<!cir.int<s, 32> x 5>>>
40+
// CHECK: cir.func @func3(%arg0: !cir.ptr<!cir.array<!s32i x 5>>
41+
// CHECK: cir.alloca !cir.ptr<!cir.array<!s32i x 5>>, !cir.ptr<!cir.ptr<!cir.array<!s32i x 5>>>

clang/test/CIR/CodeGen/basic.c

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,15 @@ int f1(int i) {
1313
}
1414

1515
// CIR: module
16-
// CIR-NEXT: cir.func @f1(%arg0: !cir.int<s, 32> loc({{.*}})) -> !cir.int<s, 32>
17-
// CIR-NEXT: %[[I_PTR:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["i", init] {alignment = 4 : i64}
18-
// CIR-NEXT: %[[RV:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
19-
// CIR-NEXT: cir.store %arg0, %[[I_PTR]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
20-
// CIR-NEXT: %[[I_IGNORED:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
21-
// CIR-NEXT: %[[I:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
22-
// CIR-NEXT: cir.store %[[I]], %[[RV]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
23-
// CIR-NEXT: cir.br ^[[BB1:[^ ]+]]
24-
// CIR-NEXT: ^[[BB1]]:
25-
// CIR-NEXT: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
26-
// CIR-NEXT: cir.return %[[R]] : !cir.int<s, 32>
16+
// CIR-NEXT: cir.func @f1(%arg0: !s32i loc({{.*}})) -> !s32i
17+
// CIR-NEXT: %[[I_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init] {alignment = 4 : i64}
18+
// CIR-NEXT: %[[RV:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
19+
// CIR-NEXT: cir.store %arg0, %[[I_PTR]] : !s32i, !cir.ptr<!s32i>
20+
// CIR-NEXT: %[[I_IGNORED:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!s32i>, !s32i
21+
// CIR-NEXT: %[[I:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!s32i>, !s32i
22+
// CIR-NEXT: cir.store %[[I]], %[[RV]] : !s32i, !cir.ptr<!s32i>
23+
// CIR-NEXT: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!s32i>, !s32i
24+
// CIR-NEXT: cir.return %[[R]] : !s32i
2725

2826
// LLVM: define i32 @f1(i32 %[[IP:.*]])
2927
// LLVM-NEXT: %[[I_PTR:.*]] = alloca i32, i64 1, align 4
@@ -32,8 +30,6 @@ int f1(int i) {
3230
// LLVM-NEXT: %[[I_IGNORED:.*]] = load i32, ptr %[[I_PTR]], align 4
3331
// LLVM-NEXT: %[[I:.*]] = load i32, ptr %[[I_PTR]], align 4
3432
// LLVM-NEXT: store i32 %[[I]], ptr %[[RV]], align 4
35-
// LLVM-NEXT: br label %[[BB1:.*]]
36-
// LLVM: [[BB1]]:
3733
// LLVM-NEXT: %[[R:.*]] = load i32, ptr %[[RV]], align 4
3834
// LLVM-NEXT: ret i32 %[[R]]
3935

@@ -47,20 +43,16 @@ int f1(int i) {
4743

4844
int f2(void) { return 3; }
4945

50-
// CIR: cir.func @f2() -> !cir.int<s, 32>
51-
// CIR-NEXT: %[[RV:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
52-
// CIR-NEXT: %[[THREE:.*]] = cir.const #cir.int<3> : !cir.int<s, 32>
53-
// CIR-NEXT: cir.store %[[THREE]], %[[RV]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
54-
// CIR-NEXT: cir.br ^[[BB1:[^ ]+]]
55-
// CIR-NEXT: ^[[BB1]]:
56-
// CIR-NEXT: %[[R:.*]] = cir.load %0 : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
57-
// CIR-NEXT: cir.return %[[R]] : !cir.int<s, 32>
46+
// CIR: cir.func @f2() -> !s32i
47+
// CIR-NEXT: %[[RV:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
48+
// CIR-NEXT: %[[THREE:.*]] = cir.const #cir.int<3> : !s32i
49+
// CIR-NEXT: cir.store %[[THREE]], %[[RV]] : !s32i, !cir.ptr<!s32i>
50+
// CIR-NEXT: %[[R:.*]] = cir.load %0 : !cir.ptr<!s32i>, !s32i
51+
// CIR-NEXT: cir.return %[[R]] : !s32i
5852

5953
// LLVM: define i32 @f2()
6054
// LLVM-NEXT: %[[RV:.*]] = alloca i32, i64 1, align 4
6155
// LLVM-NEXT: store i32 3, ptr %[[RV]], align 4
62-
// LLVM-NEXT: br label %[[BB1:.*]]
63-
// LLVM: [[BB1]]:
6456
// LLVM-NEXT: %[[R:.*]] = load i32, ptr %[[RV]], align 4
6557
// LLVM-NEXT: ret i32 %[[R]]
6658

@@ -73,26 +65,22 @@ int f3(void) {
7365
return i;
7466
}
7567

76-
// CIR: cir.func @f3() -> !cir.int<s, 32>
77-
// CIR-NEXT: %[[RV:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
78-
// CIR-NEXT: %[[I_PTR:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["i", init] {alignment = 4 : i64}
79-
// CIR-NEXT: %[[THREE:.*]] = cir.const #cir.int<3> : !cir.int<s, 32>
80-
// CIR-NEXT: cir.store %[[THREE]], %[[I_PTR]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
81-
// CIR-NEXT: %[[I:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
82-
// CIR-NEXT: cir.store %[[I]], %[[RV]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
83-
// CIR-NEXT: cir.br ^[[BB1:[^ ]+]]
84-
// CIR-NEXT: ^[[BB1]]:
85-
// CIR-NEXT: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
86-
// CIR-NEXT: cir.return %[[R]] : !cir.int<s, 32>
68+
// CIR: cir.func @f3() -> !s32i
69+
// CIR-NEXT: %[[RV:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
70+
// CIR-NEXT: %[[I_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init] {alignment = 4 : i64}
71+
// CIR-NEXT: %[[THREE:.*]] = cir.const #cir.int<3> : !s32i
72+
// CIR-NEXT: cir.store %[[THREE]], %[[I_PTR]] : !s32i, !cir.ptr<!s32i>
73+
// CIR-NEXT: %[[I:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!s32i>, !s32i
74+
// CIR-NEXT: cir.store %[[I]], %[[RV]] : !s32i, !cir.ptr<!s32i>
75+
// CIR-NEXT: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!s32i>, !s32i
76+
// CIR-NEXT: cir.return %[[R]] : !s32i
8777

8878
// LLVM: define i32 @f3()
8979
// LLVM-NEXT: %[[RV:.*]] = alloca i32, i64 1, align 4
9080
// LLVM-NEXT: %[[I_PTR:.*]] = alloca i32, i64 1, align 4
9181
// LLVM-NEXT: store i32 3, ptr %[[I_PTR]], align 4
9282
// LLVM-NEXT: %[[I:.*]] = load i32, ptr %[[I_PTR]], align 4
9383
// LLVM-NEXT: store i32 %[[I]], ptr %[[RV]], align 4
94-
// LLVM-NEXT: br label %[[BB1:.*]]
95-
// LLVM: [[BB1]]:
9684
// LLVM-NEXT: %[[R:.*]] = load i32, ptr %[[RV]], align 4
9785
// LLVM-NEXT: ret i32 %[[R]]
9886

clang/test/CIR/CodeGen/basic.cpp

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,51 +6,51 @@ int f1() {
66
}
77

88
// CHECK: module
9-
// CHECK: cir.func @f1() -> !cir.int<s, 32>
10-
// CHECK: %[[RV:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
11-
// CHECK: %[[I_PTR:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["i"] {alignment = 4 : i64}
12-
// CHECK: %[[I:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
13-
// CHECK: cir.store %[[I]], %[[RV]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
14-
// CHECK: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
15-
// CHECK: cir.return %[[R]] : !cir.int<s, 32>
9+
// CHECK: cir.func @f1() -> !s32i
10+
// CHECK: %[[RV:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
11+
// CHECK: %[[I_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i"] {alignment = 4 : i64}
12+
// CHECK: %[[I:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!s32i>, !s32i
13+
// CHECK: cir.store %[[I]], %[[RV]] : !s32i, !cir.ptr<!s32i>
14+
// CHECK: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!s32i>, !s32i
15+
// CHECK: cir.return %[[R]] : !s32i
1616

1717
int f2() {
1818
const int i = 2;
1919
return i;
2020
}
2121

22-
// CHECK: cir.func @f2() -> !cir.int<s, 32>
23-
// CHECK: %[[RV:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
24-
// CHECK: %[[I_PTR:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["i", init, const] {alignment = 4 : i64}
25-
// CHECK: %[[TWO:.*]] = cir.const #cir.int<2> : !cir.int<s, 32>
26-
// CHECK: cir.store %[[TWO]], %[[I_PTR]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
27-
// CHECK: %[[I:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
28-
// CHECK: cir.store %[[I]], %[[RV]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
29-
// CHECK: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
30-
// CHECK: cir.return %[[R]] : !cir.int<s, 32>
22+
// CHECK: cir.func @f2() -> !s32i
23+
// CHECK: %[[RV:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
24+
// CHECK: %[[I_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init, const] {alignment = 4 : i64}
25+
// CHECK: %[[TWO:.*]] = cir.const #cir.int<2> : !s32i
26+
// CHECK: cir.store %[[TWO]], %[[I_PTR]] : !s32i, !cir.ptr<!s32i>
27+
// CHECK: %[[I:.*]] = cir.load %[[I_PTR]] : !cir.ptr<!s32i>, !s32i
28+
// CHECK: cir.store %[[I]], %[[RV]] : !s32i, !cir.ptr<!s32i>
29+
// CHECK: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!s32i>, !s32i
30+
// CHECK: cir.return %[[R]] : !s32i
3131

3232
int f3(int i) {
3333
return i;
3434
}
3535

36-
// CHECK: cir.func @f3(%[[ARG:.*]]: !cir.int<s, 32> loc({{.*}})) -> !cir.int<s, 32>
37-
// CHECK: %[[ARG_ALLOCA:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["i", init] {alignment = 4 : i64}
38-
// CHECK: %[[RV:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
39-
// CHECK: cir.store %[[ARG]], %[[ARG_ALLOCA]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
40-
// CHECK: %[[ARG_VAL:.*]] = cir.load %[[ARG_ALLOCA]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
41-
// CHECK: cir.store %[[ARG_VAL]], %[[RV]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
42-
// CHECK: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
43-
// CHECK: cir.return %[[R]] : !cir.int<s, 32>
36+
// CHECK: cir.func @f3(%[[ARG:.*]]: !s32i loc({{.*}})) -> !s32i
37+
// CHECK: %[[ARG_ALLOCA:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init] {alignment = 4 : i64}
38+
// CHECK: %[[RV:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
39+
// CHECK: cir.store %[[ARG]], %[[ARG_ALLOCA]] : !s32i, !cir.ptr<!s32i>
40+
// CHECK: %[[ARG_VAL:.*]] = cir.load %[[ARG_ALLOCA]] : !cir.ptr<!s32i>, !s32i
41+
// CHECK: cir.store %[[ARG_VAL]], %[[RV]] : !s32i, !cir.ptr<!s32i>
42+
// CHECK: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!s32i>, !s32i
43+
// CHECK: cir.return %[[R]] : !s32i
4444

4545
int f4(const int i) {
4646
return i;
4747
}
4848

49-
// CHECK: cir.func @f4(%[[ARG:.*]]: !cir.int<s, 32> loc({{.*}})) -> !cir.int<s, 32>
50-
// CHECK: %[[ARG_ALLOCA:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["i", init, const] {alignment = 4 : i64}
51-
// CHECK: %[[RV:.*]] = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
52-
// CHECK: cir.store %[[ARG]], %[[ARG_ALLOCA]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
53-
// CHECK: %[[ARG_VAL:.*]] = cir.load %[[ARG_ALLOCA]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
54-
// CHECK: cir.store %[[ARG_VAL]], %[[RV]] : !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>
55-
// CHECK: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!cir.int<s, 32>>, !cir.int<s, 32>
56-
// CHECK: cir.return %[[R]] : !cir.int<s, 32>
49+
// CHECK: cir.func @f4(%[[ARG:.*]]: !s32i loc({{.*}})) -> !s32i
50+
// CHECK: %[[ARG_ALLOCA:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init, const] {alignment = 4 : i64}
51+
// CHECK: %[[RV:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
52+
// CHECK: cir.store %[[ARG]], %[[ARG_ALLOCA]] : !s32i, !cir.ptr<!s32i>
53+
// CHECK: %[[ARG_VAL:.*]] = cir.load %[[ARG_ALLOCA]] : !cir.ptr<!s32i>, !s32i
54+
// CHECK: cir.store %[[ARG_VAL]], %[[RV]] : !s32i, !cir.ptr<!s32i>
55+
// CHECK: %[[R:.*]] = cir.load %[[RV]] : !cir.ptr<!s32i>, !s32i
56+
// CHECK: cir.return %[[R]] : !s32i

clang/test/CIR/CodeGen/cast.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ unsigned char cxxstaticcast_0(unsigned int x) {
88
}
99

1010
// CIR: cir.func @cxxstaticcast_0
11-
// CIR: %[[XPTR:[0-9]+]] = cir.alloca !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>, ["x", init] {alignment = 4 : i64}
12-
// CIR: %[[RV:[0-9]+]] = cir.alloca !cir.int<u, 8>, !cir.ptr<!cir.int<u, 8>>, ["__retval"] {alignment = 1 : i64}
13-
// CIR: cir.store %arg0, %[[XPTR]] : !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>
14-
// CIR: %[[XVAL:[0-9]+]] = cir.load %[[XPTR]] : !cir.ptr<!cir.int<u, 32>>, !cir.int<u, 32>
15-
// CIR: %[[CASTED:[0-9]+]] = cir.cast(integral, %[[XVAL]] : !cir.int<u, 32>), !cir.int<u, 8>
16-
// CIR: cir.store %[[CASTED]], %[[RV]] : !cir.int<u, 8>, !cir.ptr<!cir.int<u, 8>>
17-
// CIR: %[[R:[0-9]+]] = cir.load %1 : !cir.ptr<!cir.int<u, 8>>, !cir.int<u, 8>
18-
// CIR: cir.return %[[R]] : !cir.int<u, 8>
11+
// CIR: %[[XPTR:[0-9]+]] = cir.alloca !u32i, !cir.ptr<!u32i>, ["x", init] {alignment = 4 : i64}
12+
// CIR: %[[RV:[0-9]+]] = cir.alloca !u8i, !cir.ptr<!u8i>, ["__retval"] {alignment = 1 : i64}
13+
// CIR: cir.store %arg0, %[[XPTR]] : !u32i, !cir.ptr<!u32i>
14+
// CIR: %[[XVAL:[0-9]+]] = cir.load %[[XPTR]] : !cir.ptr<!u32i>, !u32i
15+
// CIR: %[[CASTED:[0-9]+]] = cir.cast(integral, %[[XVAL]] : !u32i), !u8i
16+
// CIR: cir.store %[[CASTED]], %[[RV]] : !u8i, !cir.ptr<!u8i>
17+
// CIR: %[[R:[0-9]+]] = cir.load %1 : !cir.ptr<!u8i>, !u8i
18+
// CIR: cir.return %[[R]] : !u8i
1919
// CIR: }
2020

2121
// LLVM: define i8 @cxxstaticcast_0(i32 %{{[0-9]+}})
@@ -31,41 +31,41 @@ int cStyleCasts_0(unsigned x1, int x2, float x3, short x4, double x5) {
3131
// LLVM: define i32 @cStyleCasts_0
3232

3333
char a = (char)x1; // truncate
34-
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !cir.int<u, 32>), !cir.int<s, 8>
34+
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !u32i), !s8i
3535
// LLVM: %{{[0-9]+}} = trunc i32 %{{[0-9]+}} to i8
3636

3737
short b = (short)x2; // truncate with sign
38-
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !cir.int<s, 32>), !cir.int<s, 16>
38+
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !s32i), !s16i
3939
// LLVM: %{{[0-9]+}} = trunc i32 %{{[0-9]+}} to i16
4040

4141
long long c = (long long)x1; // zero extend
42-
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !cir.int<u, 32>), !cir.int<s, 64>
42+
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !u32i), !s64i
4343
// LLVM: %{{[0-9]+}} = zext i32 %{{[0-9]+}} to i64
4444

4545
long long d = (long long)x2; // sign extend
46-
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !cir.int<s, 32>), !cir.int<s, 64>
46+
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !s32i), !s64i
4747
// LLVM: %{{[0-9]+}} = sext i32 %{{[0-9]+}} to i64
4848

4949
unsigned ui = (unsigned)x2; // sign drop
50-
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !cir.int<s, 32>), !cir.int<u, 32>
50+
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !s32i), !u32i
5151

5252
int si = (int)x1; // sign add
53-
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !cir.int<u, 32>), !cir.int<s, 32>
53+
// CIR: %{{[0-9]+}} = cir.cast(integral, %{{[0-9]+}} : !u32i), !s32i
5454

5555
bool ib;
5656
int bi = (int)ib; // bool to int
57-
// CIR: %{{[0-9]+}} = cir.cast(bool_to_int, %{{[0-9]+}} : !cir.bool), !cir.int<s, 32>
57+
// CIR: %{{[0-9]+}} = cir.cast(bool_to_int, %{{[0-9]+}} : !cir.bool), !s32i
5858
// LLVM: %{{[0-9]+}} = zext i1 %{{[0-9]+}} to i32
5959

6060
#ifdef CIR_ONLY
6161
bool b2 = x2; // int to bool
62-
// CIR: %{{[0-9]+}} = cir.cast(int_to_bool, %{{[0-9]+}} : !cir.int<s, 32>), !cir.bool
62+
// CIR: %{{[0-9]+}} = cir.cast(int_to_bool, %{{[0-9]+}} : !s32i), !cir.bool
6363
#endif
6464

6565
#ifdef CIR_ONLY
6666
void *p;
6767
bool b3 = p; // ptr to bool
68-
// CIR: %{{[0-9]+}} = cir.cast(ptr_to_bool, %{{[0-9]+}} : !cir.ptr<!cir.void>), !cir.bool
68+
// CIR: %{{[0-9]+}} = cir.cast(ptr_to_bool, %{{[0-9]+}} : !cir.ptr<!void>), !cir.bool
6969
#endif
7070

7171
float f;
@@ -83,11 +83,11 @@ bool cptr(void *d) {
8383
return x;
8484
}
8585

86-
// CIR: cir.func @cptr(%arg0: !cir.ptr<!cir.void>
87-
// CIR: %[[DPTR:[0-9]+]] = cir.alloca !cir.ptr<!cir.void>, !cir.ptr<!cir.ptr<!cir.void>>, ["d", init] {alignment = 8 : i64}
86+
// CIR: cir.func @cptr(%arg0: !cir.ptr<!void>
87+
// CIR: %[[DPTR:[0-9]+]] = cir.alloca !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>, ["d", init] {alignment = 8 : i64}
8888

89-
// CIR: %[[DVAL:[0-9]+]] = cir.load %[[DPTR]] : !cir.ptr<!cir.ptr<!cir.void>>, !cir.ptr<!cir.void>
90-
// CIR: %{{[0-9]+}} = cir.cast(ptr_to_bool, %[[DVAL]] : !cir.ptr<!cir.void>), !cir.bool
89+
// CIR: %[[DVAL:[0-9]+]] = cir.load %[[DPTR]] : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void>
90+
// CIR: %{{[0-9]+}} = cir.cast(ptr_to_bool, %[[DVAL]] : !cir.ptr<!void>), !cir.bool
9191
#endif
9292

9393
void should_not_cast() {

0 commit comments

Comments
 (0)