2
2
// RUN: FileCheck --input-file=%t.cir %s
3
3
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll
4
4
// RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM
5
- // XFAIL: *
6
5
7
6
typedef struct {
8
7
int f0 : 24 ;
@@ -22,7 +21,7 @@ static int **g8 = &g7[1];
22
21
23
22
// CHECK-DAG: !rec_anon_struct = !cir.record<struct {!u8i, !u8i, !u8i, !u8i, !s32i, !s32i}>
24
23
// CHECK-DAG: !rec_anon_struct1 = !cir.record<struct {!s8i, !cir.array<!u8i x 3>, !s32i}>
25
- // CHECK-DAG: !rec_anon_struct2 = !cir.record<struct {!u8i, !u8i, !u8i, !u8i, !u8i, !u8i, !u8i, !u8i, !rec_S4_ }>
24
+ // CHECK-DAG: !rec_anon_struct2 = !cir.record<struct {!u8i, !u8i, !u8i, !u8i, !u8i, !u8i, !u8i, !u8i, !rec_S4 }>
26
25
// CHECK-DAG: !rec_anon_struct3 = !cir.record<struct {!s16i, !cir.array<!u8i x 2>, !s32i, !s8i, !cir.array<!u8i x 3>}>
27
26
28
27
// CHECK-DAG: g1 = #cir.const_record<{#cir.int<239> : !u8i, #cir.int<10> : !u8i, #cir.int<0> : !u8i, #cir.zero : !u8i, #cir.int<9> : !s32i, #cir.int<123> : !s32i}> : !rec_anon_struct
@@ -35,18 +34,13 @@ static int **g8 = &g7[1];
35
34
// CHECK-DAG: g8 = #cir.global_view<@g7, [1 : i32]> : !cir.ptr<!cir.ptr<!s32i>>
36
35
37
36
// LLVM-DAG: @g1 = internal global { i8, i8, i8, i8, i32, i32 } { i8 -17, i8 10, i8 0, i8 0, i32 9, i32 123 }, align 4
38
- // LLVM-DAG: @g2 = internal global [4 x ptr] [ptr getelementptr inbounds ({ i8, i8, i8, i8, i32, i32 }, ptr @g1, i32 0, i32 4), ptr getelementptr inbounds ({ i8, i8, i8, i8, i32, i32 }, ptr @g1, i32 0, i32 4), ptr getelementptr inbounds ({ i8, i8, i8, i8, i32, i32 }, ptr @g1, i32 0, i32 4), ptr getelementptr inbounds ({ i8, i8, i8, i8, i32, i32 }, ptr @g1, i32 0, i32 4)], align 16
39
- // LLVM-DAG: @g3 = internal global ptr getelementptr inbounds ([4 x ptr] , ptr @g2, i32 0, i32 1 ), align 8
37
+ // LLVM-DAG: @g2 = internal global [4 x ptr] [ptr getelementptr inbounds nuw ( i8, ptr @g1, i64 4), ptr getelementptr inbounds nuw ( i8, ptr @g1, i64 4), ptr getelementptr inbounds nuw ( i8, ptr @g1, i64 4), ptr getelementptr inbounds nuw ( i8, ptr @g1, i64 4)], align 16
38
+ // LLVM-DAG: @g3 = internal global ptr getelementptr inbounds nuw (i8 , ptr @g2, i64 8 ), align 8
40
39
// LLVM-DAG: @g4 = internal global ptr @g3, align 8
41
40
// LLVM-DAG: @g5 = internal global ptr @g4, align 8
42
41
// LLVM-DAG: @g6 = internal global [2 x { i8, i8, i8, i8, i32, i32 }] [{ i8, i8, i8, i8, i32, i32 } { i8 -17, i8 10, i8 0, i8 0, i32 9, i32 123 }, { i8, i8, i8, i8, i32, i32 } { i8 -17, i8 10, i8 0, i8 0, i32 9, i32 123 }], align 16
43
- // LLVM-DAG: @g7 = internal global [2 x ptr] [ptr getelementptr inbounds ([2 x { i8, i8, i8, i8, i32, i32 }], ptr @g6, i32 0, i32 0, i32 5), ptr getelementptr inbounds ([2 x { i8, i8, i8, i8, i32, i32 }], ptr @g6, i32 0, i32 1, i32 5)], align 16
44
- // LLVM-DAG: @g8 = internal global ptr getelementptr inbounds ([2 x ptr], ptr @g7, i32 0, i32 1), align 8
45
-
46
- // FIXME: LLVM output should be: @g2 = internal global [4 x ptr] [ptr getelementptr (i8, ptr @g1, i64 4), ptr getelementptr (i8, ptr @g1, i64 4), ptr getelementptr (i8, ptr @g1, i64 4), ptr getelementptr (i8, ptr @g1, i64 4)], align 16
47
- // FIXME: LLVM output should be: @g3 = internal global ptr getelementptr (i8, ptr @g2, i64 8), align 8
48
- // FIXME: LLVM output should be: @g7 = internal global [2 x ptr] [ptr getelementptr (i8, ptr @g6, i64 8), ptr getelementptr (i8, ptr @g6, i64 20)], align 16
49
- // FIXME: LLVM output should be: @g8 = internal global ptr getelementptr (i8, ptr @g7, i64 8), align 8
42
+ // LLVM-DAG: @g7 = internal global [2 x ptr] [ptr getelementptr inbounds nuw (i8, ptr @g6, i64 8), ptr getelementptr inbounds nuw (i8, ptr @g6, i64 20)], align 16
43
+ // LLVM-DAG: @g8 = internal global ptr getelementptr inbounds nuw (i8, ptr @g7, i64 8), align 8
50
44
51
45
typedef struct {
52
46
char f1 ;
@@ -69,16 +63,13 @@ int* g12 = &g11.f6;
69
63
70
64
// CHECK-DAG: g9 = #cir.const_record<{#cir.int<1> : !s8i, #cir.const_array<[#cir.zero : !u8i, #cir.zero : !u8i, #cir.zero : !u8i]> : !cir.array<!u8i x 3>, #cir.int<42> : !s32i}> : !rec_anon_struct1 {alignment = 4 : i64}
71
65
// CHECK-DAG: g10 = #cir.global_view<@g9, [2 : i32]> : !cir.ptr<!s32i> {alignment = 8 : i64}
72
- // CHECK-DAG: g11 = #cir.const_record<{#cir.int<1> : !s8i, #cir.int<42> : !s32i}> : !rec_S2_ {alignment = 1 : i64}
66
+ // CHECK-DAG: g11 = #cir.const_record<{#cir.int<1> : !s8i, #cir.int<42> : !s32i}> : !rec_S2 {alignment = 1 : i64}
73
67
// CHECK-DAG: g12 = #cir.global_view<@g11, [1 : i32]> : !cir.ptr<!s32i> {alignment = 8 : i64}
74
68
75
69
// LLVM-DAG: @g9 = global { i8, [3 x i8], i32 } { i8 1, [3 x i8] zeroinitializer, i32 42 }, align 4
76
- // LLVM-DAG: @g10 = global ptr getelementptr inbounds ({ i8, [3 x i8], i32 }, ptr @g9, i32 0, i32 2 ), align 8
70
+ // LLVM-DAG: @g10 = global ptr getelementptr inbounds nuw ( i8, ptr @g9, i64 4 ), align 8
77
71
// LLVM-DAG: @g11 = global %struct.S2 <{ i8 1, i32 42 }>, align 1
78
- // LLVM-DAG: @g12 = global ptr getelementptr inbounds (%struct.S2, ptr @g11, i32 0, i32 1), align 8
79
-
80
- // FIXME: LLVM output should be: @g10 = dso_local global ptr getelementptr (i8, ptr @g9, i64 4), align 8
81
- // FIXME: LLVM output should be: @g12 = dso_local global ptr getelementptr (i8, ptr @g11, i64 1), align 8
72
+ // LLVM-DAG: @g12 = global ptr getelementptr inbounds nuw (i8, ptr @g11, i64 1), align 8
82
73
83
74
84
75
typedef struct {
@@ -91,7 +82,7 @@ static S3 g13 = {-1L,0L,1L};
91
82
static S3 * g14 [2 ][2 ] = {{0 , & g13 }, {& g13 , & g13 }};
92
83
93
84
// CHECK-DAG: g13 = #cir.const_record<{#cir.int<-1> : !s16i, #cir.const_array<[#cir.zero : !u8i, #cir.zero : !u8i]> : !cir.array<!u8i x 2>, #cir.int<0> : !s32i, #cir.int<1> : !s8i, #cir.const_array<[#cir.zero : !u8i, #cir.zero : !u8i, #cir.zero : !u8i]> : !cir.array<!u8i x 3>}> : !rec_anon_struct3
94
- // CHECK-DAG: g14 = #cir.const_array<[#cir.const_array<[#cir.ptr<null> : !cir.ptr<!rec_S3_ >, #cir.global_view<@g13> : !cir.ptr<!rec_S3_ >]> : !cir.array<!cir.ptr<!rec_S3_ > x 2>, #cir.const_array<[#cir.global_view<@g13> : !cir.ptr<!rec_S3_ >, #cir.global_view<@g13> : !cir.ptr<!rec_S3_ >]> : !cir.array<!cir.ptr<!rec_S3_ > x 2>]> : !cir.array<!cir.array<!cir.ptr<!rec_S3_ > x 2> x 2>
85
+ // CHECK-DAG: g14 = #cir.const_array<[#cir.const_array<[#cir.ptr<null> : !cir.ptr<!rec_S3 >, #cir.global_view<@g13> : !cir.ptr<!rec_S3 >]> : !cir.array<!cir.ptr<!rec_S3 > x 2>, #cir.const_array<[#cir.global_view<@g13> : !cir.ptr<!rec_S3 >, #cir.global_view<@g13> : !cir.ptr<!rec_S3 >]> : !cir.array<!cir.ptr<!rec_S3 > x 2>]> : !cir.array<!cir.array<!cir.ptr<!rec_S3 > x 2> x 2>
95
86
96
87
typedef struct {
97
88
int f0 ;
@@ -109,13 +100,11 @@ static S5 g15 = {187,1,442,{123,321}};
109
100
110
101
int * g16 = & g15 .f3 .f1 ;
111
102
112
- // CHECK-DAG: g15 = #cir.const_record<{#cir.int<187> : !u8i, #cir.int<0> : !u8i, #cir.int<2> : !u8i, #cir.zero : !u8i, #cir.int<186> : !u8i, #cir.int<1> : !u8i, #cir.int<0> : !u8i, #cir.zero : !u8i, #cir.const_record<{#cir.int<123> : !s32i, #cir.int<321> : !s32i}> : !rec_S4_ }> : !rec_anon_struct2 {alignment = 4 : i64}
103
+ // CHECK-DAG: g15 = #cir.const_record<{#cir.int<187> : !u8i, #cir.int<0> : !u8i, #cir.int<2> : !u8i, #cir.zero : !u8i, #cir.int<186> : !u8i, #cir.int<1> : !u8i, #cir.int<0> : !u8i, #cir.zero : !u8i, #cir.const_record<{#cir.int<123> : !s32i, #cir.int<321> : !s32i}> : !rec_S4 }> : !rec_anon_struct2 {alignment = 4 : i64}
113
104
// CHECK-DAG: g16 = #cir.global_view<@g15, [8, 1]> : !cir.ptr<!rec_anon_struct2> {alignment = 8 : i64}
114
105
115
106
// LLVM-DAG: @g15 = internal global { i8, i8, i8, i8, i8, i8, i8, i8, %struct.S4 } { i8 -69, i8 0, i8 2, i8 0, i8 -70, i8 1, i8 0, i8 0, %struct.S4 { i32 123, i32 321 } }, align 4
116
- // LLVM-DAG: @g16 = global ptr getelementptr inbounds ({ i8, i8, i8, i8, i8, i8, i8, i8, %struct.S4 }, ptr @g15, i32 0, i32 8, i32 1), align 8
117
-
118
- // FIXME: LLVM output should be: @g16 = dso_local global ptr getelementptr (i8, ptr @g15, i64 12), align 8
107
+ // LLVM-DAG: @g16 = global ptr getelementptr inbounds nuw (i8, ptr @g15, i64 12), align 8
119
108
120
109
void use () {
121
110
int a = * * g3 ;
0 commit comments