Skip to content

Commit 8cc1d6f

Browse files
authored
[CIR] Add value initialization for scalar types (#156036)
1 parent b3452d9 commit 8cc1d6f

File tree

2 files changed

+199
-50
lines changed

2 files changed

+199
-50
lines changed

clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
9292
mlir::Value value, CastKind kind,
9393
QualType destTy);
9494

95+
mlir::Value emitNullValue(QualType ty, mlir::Location loc) {
96+
return cgf.cgm.emitNullConstant(ty, loc);
97+
}
98+
9599
mlir::Value emitPromotedValue(mlir::Value result, QualType promotionType) {
96100
return builder.createFloatingCast(result, cgf.convertType(promotionType));
97101
}
@@ -182,6 +186,13 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
182186
return builder.getBool(e->getValue(), cgf.getLoc(e->getExprLoc()));
183187
}
184188

189+
mlir::Value VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *e) {
190+
if (e->getType()->isVoidType())
191+
return {};
192+
193+
return emitNullValue(e->getType(), cgf.getLoc(e->getSourceRange()));
194+
}
195+
185196
mlir::Value VisitCastExpr(CastExpr *e);
186197
mlir::Value VisitCallExpr(const CallExpr *e);
187198

@@ -1966,11 +1977,9 @@ mlir::Value ScalarExprEmitter::VisitInitListExpr(InitListExpr *e) {
19661977
cgf.getLoc(e->getSourceRange()), vectorType, elements);
19671978
}
19681979

1969-
if (numInitElements == 0) {
1970-
cgf.cgm.errorNYI(e->getSourceRange(),
1971-
"InitListExpr Non VectorType with 0 init elements");
1972-
return {};
1973-
}
1980+
// C++11 value-initialization for the scalar.
1981+
if (numInitElements == 0)
1982+
return emitNullValue(e->getType(), cgf.getLoc(e->getExprLoc()));
19741983

19751984
return Visit(e->getInit(0));
19761985
}
Lines changed: 185 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t-cir.ll
2-
// RUN: FileCheck -input-file=%t-cir.ll %s
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-cir.ll
4+
// RUN: FileCheck --input-file=%t-cir.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
37

48
void test() {
59
int i = 1;
@@ -21,46 +25,182 @@ void test() {
2125
bool uib;
2226
}
2327

24-
// CHECK: module
25-
// CHECK: cir.func{{.*}} @_Z4testv()
26-
// CHECK: %[[I_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init] {alignment = 4 : i64}
27-
// CHECK: %[[L_PTR:.*]] = cir.alloca !s64i, !cir.ptr<!s64i>, ["l", init] {alignment = 8 : i64}
28-
// CHECK: %[[F_PTR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["f", init] {alignment = 4 : i64}
29-
// CHECK: %[[D_PTR:.*]] = cir.alloca !cir.double, !cir.ptr<!cir.double>, ["d", init] {alignment = 8 : i64}
30-
// CHECK: %[[B1_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b1", init] {alignment = 1 : i64}
31-
// CHECK: %[[B2_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b2", init] {alignment = 1 : i64}
32-
// CHECK: %[[CI_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["ci", init, const] {alignment = 4 : i64}
33-
// CHECK: %[[CL_PTR:.*]] = cir.alloca !s64i, !cir.ptr<!s64i>, ["cl", init, const] {alignment = 8 : i64}
34-
// CHECK: %[[CF_PTR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["cf", init, const] {alignment = 4 : i64}
35-
// CHECK: %[[CD_PTR:.*]] = cir.alloca !cir.double, !cir.ptr<!cir.double>, ["cd", init, const] {alignment = 8 : i64}
36-
// CHECK: %[[CB1_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["cb1", init, const] {alignment = 1 : i64}
37-
// CHECK: %[[CB2_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["cb2", init, const] {alignment = 1 : i64}
38-
// CHECK: %[[UII_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["uii"] {alignment = 4 : i64}
39-
// CHECK: %[[UIL_PTR:.*]] = cir.alloca !s64i, !cir.ptr<!s64i>, ["uil"] {alignment = 8 : i64}
40-
// CHECK: %[[UIF_PTR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["uif"] {alignment = 4 : i64}
41-
// CHECK: %[[UID_PTR:.*]] = cir.alloca !cir.double, !cir.ptr<!cir.double>, ["uid"] {alignment = 8 : i64}
42-
// CHECK: %[[UIB_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["uib"] {alignment = 1 : i64}
43-
// CHECK: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
44-
// CHECK: cir.store align(4) %[[ONE]], %[[I_PTR]] : !s32i, !cir.ptr<!s32i>
45-
// CHECK: %[[TWO:.*]] = cir.const #cir.int<2> : !s64i
46-
// CHECK: cir.store align(8) %[[TWO]], %[[L_PTR]] : !s64i, !cir.ptr<!s64i>
47-
// CHECK: %[[THREE:.*]] = cir.const #cir.fp<3.0{{.*}}> : !cir.float
48-
// CHECK: cir.store align(4) %[[THREE]], %[[F_PTR]] : !cir.float, !cir.ptr<!cir.float>
49-
// CHECK: %[[FOUR:.*]] = cir.const #cir.fp<4.0{{.*}}> : !cir.double
50-
// CHECK: cir.store align(8) %[[FOUR]], %[[D_PTR]] : !cir.double, !cir.ptr<!cir.double>
51-
// CHECK: %[[TRUE:.*]] = cir.const #true
52-
// CHECK: cir.store align(1) %[[TRUE]], %[[B1_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
53-
// CHECK: %[[FALSE:.*]] = cir.const #false
54-
// CHECK: cir.store align(1) %[[FALSE]], %[[B2_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
55-
// CHECK: %[[ONEC:.*]] = cir.const #cir.int<1> : !s32i
56-
// CHECK: cir.store align(4) %[[ONEC]], %[[CI_PTR]] : !s32i, !cir.ptr<!s32i>
57-
// CHECK: %[[TWOC:.*]] = cir.const #cir.int<2> : !s64i
58-
// CHECK: cir.store align(8) %[[TWOC]], %[[CL_PTR]] : !s64i, !cir.ptr<!s64i>
59-
// CHECK: %[[THREEC:.*]] = cir.const #cir.fp<3.0{{.*}}> : !cir.float
60-
// CHECK: cir.store align(4) %[[THREEC]], %[[CF_PTR]] : !cir.float, !cir.ptr<!cir.float>
61-
// CHECK: %[[FOURC:.*]] = cir.const #cir.fp<4.0{{.*}}> : !cir.double
62-
// CHECK: cir.store align(8) %[[FOURC]], %[[CD_PTR]] : !cir.double, !cir.ptr<!cir.double>
63-
// CHECK: %[[TRUEC:.*]] = cir.const #true
64-
// CHECK: cir.store align(1) %[[TRUEC]], %[[CB1_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
65-
// CHECK: %[[FALSEC:.*]] = cir.const #false
66-
// CHECK: cir.store align(1) %[[FALSEC]], %[[CB2_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
28+
// CIR: module
29+
// CIR: cir.func{{.*}} @_Z4testv()
30+
// CIR: %[[I_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init] {alignment = 4 : i64}
31+
// CIR: %[[L_PTR:.*]] = cir.alloca !s64i, !cir.ptr<!s64i>, ["l", init] {alignment = 8 : i64}
32+
// CIR: %[[F_PTR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["f", init] {alignment = 4 : i64}
33+
// CIR: %[[D_PTR:.*]] = cir.alloca !cir.double, !cir.ptr<!cir.double>, ["d", init] {alignment = 8 : i64}
34+
// CIR: %[[B1_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b1", init] {alignment = 1 : i64}
35+
// CIR: %[[B2_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b2", init] {alignment = 1 : i64}
36+
// CIR: %[[CI_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["ci", init, const] {alignment = 4 : i64}
37+
// CIR: %[[CL_PTR:.*]] = cir.alloca !s64i, !cir.ptr<!s64i>, ["cl", init, const] {alignment = 8 : i64}
38+
// CIR: %[[CF_PTR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["cf", init, const] {alignment = 4 : i64}
39+
// CIR: %[[CD_PTR:.*]] = cir.alloca !cir.double, !cir.ptr<!cir.double>, ["cd", init, const] {alignment = 8 : i64}
40+
// CIR: %[[CB1_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["cb1", init, const] {alignment = 1 : i64}
41+
// CIR: %[[CB2_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["cb2", init, const] {alignment = 1 : i64}
42+
// CIR: %[[UII_PTR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["uii"] {alignment = 4 : i64}
43+
// CIR: %[[UIL_PTR:.*]] = cir.alloca !s64i, !cir.ptr<!s64i>, ["uil"] {alignment = 8 : i64}
44+
// CIR: %[[UIF_PTR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["uif"] {alignment = 4 : i64}
45+
// CIR: %[[UID_PTR:.*]] = cir.alloca !cir.double, !cir.ptr<!cir.double>, ["uid"] {alignment = 8 : i64}
46+
// CIR: %[[UIB_PTR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["uib"] {alignment = 1 : i64}
47+
// CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
48+
// CIR: cir.store align(4) %[[ONE]], %[[I_PTR]] : !s32i, !cir.ptr<!s32i>
49+
// CIR: %[[TWO:.*]] = cir.const #cir.int<2> : !s64i
50+
// CIR: cir.store align(8) %[[TWO]], %[[L_PTR]] : !s64i, !cir.ptr<!s64i>
51+
// CIR: %[[THREE:.*]] = cir.const #cir.fp<3.0{{.*}}> : !cir.float
52+
// CIR: cir.store align(4) %[[THREE]], %[[F_PTR]] : !cir.float, !cir.ptr<!cir.float>
53+
// CIR: %[[FOUR:.*]] = cir.const #cir.fp<4.0{{.*}}> : !cir.double
54+
// CIR: cir.store align(8) %[[FOUR]], %[[D_PTR]] : !cir.double, !cir.ptr<!cir.double>
55+
// CIR: %[[TRUE:.*]] = cir.const #true
56+
// CIR: cir.store align(1) %[[TRUE]], %[[B1_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
57+
// CIR: %[[FALSE:.*]] = cir.const #false
58+
// CIR: cir.store align(1) %[[FALSE]], %[[B2_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
59+
// CIR: %[[ONEC:.*]] = cir.const #cir.int<1> : !s32i
60+
// CIR: cir.store align(4) %[[ONEC]], %[[CI_PTR]] : !s32i, !cir.ptr<!s32i>
61+
// CIR: %[[TWOC:.*]] = cir.const #cir.int<2> : !s64i
62+
// CIR: cir.store align(8) %[[TWOC]], %[[CL_PTR]] : !s64i, !cir.ptr<!s64i>
63+
// CIR: %[[THREEC:.*]] = cir.const #cir.fp<3.0{{.*}}> : !cir.float
64+
// CIR: cir.store align(4) %[[THREEC]], %[[CF_PTR]] : !cir.float, !cir.ptr<!cir.float>
65+
// CIR: %[[FOURC:.*]] = cir.const #cir.fp<4.0{{.*}}> : !cir.double
66+
// CIR: cir.store align(8) %[[FOURC]], %[[CD_PTR]] : !cir.double, !cir.ptr<!cir.double>
67+
// CIR: %[[TRUEC:.*]] = cir.const #true
68+
// CIR: cir.store align(1) %[[TRUEC]], %[[CB1_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
69+
// CIR: %[[FALSEC:.*]] = cir.const #false
70+
// CIR: cir.store align(1) %[[FALSEC]], %[[CB2_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
71+
72+
// LLVM: define dso_local void @_Z4testv()
73+
// LLVM: %[[I_PTR:.+]] = alloca i32
74+
// LLVM: %[[L_PTR:.+]] = alloca i64
75+
// LLVM: %[[F_PTR:.+]] = alloca float
76+
// LLVM: %[[D_PTR:.+]] = alloca double
77+
// LLVM: %[[B1_PTR:.+]] = alloca i8
78+
// LLVM: %[[B2_PTR:.+]] = alloca i8
79+
// LLVM: %[[CI_PTR:.+]] = alloca i32
80+
// LLVM: %[[CL_PTR:.+]] = alloca i64
81+
// LLVM: %[[CF_PTR:.+]] = alloca float
82+
// LLVM: %[[CD_PTR:.+]] = alloca double
83+
// LLVM: %[[CB1_PTR:.+]] = alloca i8
84+
// LLVM: %[[CB2_PTR:.+]] = alloca i8
85+
// LLVM: %[[UII_PTR:.+]] = alloca i32
86+
// LLVM: %[[UIL_PTR:.+]] = alloca i64
87+
// LLVM: %[[UIF_PTR:.+]] = alloca float
88+
// LLVM: %[[UID_PTR:.+]] = alloca double
89+
// LLVM: %[[UIB_PTR:.+]] = alloca i8
90+
// LLVM: store i32 1, ptr %[[I_PTR]]
91+
// LLVM: store i64 2, ptr %[[L_PTR]]
92+
// LLVM: store float 3.000000e+00, ptr %[[F_PTR]]
93+
// LLVM: store double 4.000000e+00, ptr %[[D_PTR]]
94+
// LLVM: store i8 1, ptr %[[B1_PTR]]
95+
// LLVM: store i8 0, ptr %[[B2_PTR]]
96+
// LLVM: store i32 1, ptr %[[CI_PTR]]
97+
// LLVM: store i64 2, ptr %[[CL_PTR]]
98+
// LLVM: store float 3.000000e+00, ptr %[[CF_PTR]]
99+
// LLVM: store double 4.000000e+00, ptr %[[CD_PTR]]
100+
// LLVM: store i8 1, ptr %[[CB1_PTR]]
101+
// LLVM: store i8 0, ptr %[[CB2_PTR]]
102+
// LLVM: ret void
103+
104+
// OGCG: define dso_local void @_Z4testv()
105+
// OGCG: %[[I_PTR:.+]] = alloca i32
106+
// OGCG: %[[L_PTR:.+]] = alloca i64
107+
// OGCG: %[[F_PTR:.+]] = alloca float
108+
// OGCG: %[[D_PTR:.+]] = alloca double
109+
// OGCG: %[[B1_PTR:.+]] = alloca i8
110+
// OGCG: %[[B2_PTR:.+]] = alloca i8
111+
// OGCG: %[[CI_PTR:.+]] = alloca i32
112+
// OGCG: %[[CL_PTR:.+]] = alloca i64
113+
// OGCG: %[[CF_PTR:.+]] = alloca float
114+
// OGCG: %[[CD_PTR:.+]] = alloca double
115+
// OGCG: %[[CB1_PTR:.+]] = alloca i8
116+
// OGCG: %[[CB2_PTR:.+]] = alloca i8
117+
// OGCG: %[[UII_PTR:.+]] = alloca i32
118+
// OGCG: %[[UIL_PTR:.+]] = alloca i64
119+
// OGCG: %[[UIF_PTR:.+]] = alloca float
120+
// OGCG: %[[UID_PTR:.+]] = alloca double
121+
// OGCG: %[[UIB_PTR:.+]] = alloca i8
122+
// OGCG: store i32 1, ptr %[[I_PTR]]
123+
// OGCG: store i64 2, ptr %[[L_PTR]]
124+
// OGCG: store float 3.000000e+00, ptr %[[F_PTR]]
125+
// OGCG: store double 4.000000e+00, ptr %[[D_PTR]]
126+
// OGCG: store i8 1, ptr %[[B1_PTR]]
127+
// OGCG: store i8 0, ptr %[[B2_PTR]]
128+
// OGCG: store i32 1, ptr %[[CI_PTR]]
129+
// OGCG: store i64 2, ptr %[[CL_PTR]]
130+
// OGCG: store float 3.000000e+00, ptr %[[CF_PTR]]
131+
// OGCG: store double 4.000000e+00, ptr %[[CD_PTR]]
132+
// OGCG: store i8 1, ptr %[[CB1_PTR]]
133+
// OGCG: store i8 0, ptr %[[CB2_PTR]]
134+
// OGCG: ret void
135+
136+
void value_init() {
137+
float f{};
138+
bool b{};
139+
int i{};
140+
141+
float f2 = {};
142+
bool b2 = {};
143+
int i2 = {};
144+
145+
bool scalar_value_init_expr = int() == 0;
146+
}
147+
148+
// CIR: cir.func{{.*}} @_Z10value_initv()
149+
// CIR: %[[F_PTR:.+]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["f", init]
150+
// CIR: %[[B_PTR:.+]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b", init]
151+
// CIR: %[[I_PTR:.+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init]
152+
// CIR: %[[F2_PTR:.+]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["f2", init]
153+
// CIR: %[[B2_PTR:.+]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b2", init]
154+
// CIR: %[[I2_PTR:.+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i2", init]
155+
// CIR: %[[S_PTR:.+]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["scalar_value_init_expr", init]
156+
// CIR: %[[ZEROF1:.+]] = cir.const #cir.fp<0.000000e+00> : !cir.float
157+
// CIR: cir.store{{.*}} %[[ZEROF1]], %[[F_PTR]] : !cir.float, !cir.ptr<!cir.float>
158+
// CIR: %[[FALSE1:.+]] = cir.const #false
159+
// CIR: cir.store{{.*}} %[[FALSE1]], %[[B_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
160+
// CIR: %[[ZEROI1:.+]] = cir.const #cir.int<0> : !s32i
161+
// CIR: cir.store{{.*}} %[[ZEROI1]], %[[I_PTR]] : !s32i, !cir.ptr<!s32i>
162+
// CIR: %[[ZEROF2:.+]] = cir.const #cir.fp<0.000000e+00> : !cir.float
163+
// CIR: cir.store{{.*}} %[[ZEROF2]], %[[F2_PTR]] : !cir.float, !cir.ptr<!cir.float>
164+
// CIR: %[[FALSE2:.+]] = cir.const #false
165+
// CIR: cir.store{{.*}} %[[FALSE2]], %[[B2_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
166+
// CIR: %[[ZEROI2:.+]] = cir.const #cir.int<0> : !s32i
167+
// CIR: cir.store{{.*}} %[[ZEROI2]], %[[I2_PTR]] : !s32i, !cir.ptr<!s32i>
168+
// CIR: %[[ZEROI_LHS:.+]] = cir.const #cir.int<0> : !s32i
169+
// CIR: %[[ZEROI_RHS:.+]] = cir.const #cir.int<0> : !s32i
170+
// CIR: %[[CMP:.+]] = cir.cmp(eq, %[[ZEROI_LHS]], %[[ZEROI_RHS]]) : !s32i, !cir.bool
171+
// CIR: cir.store{{.*}} %[[CMP]], %[[S_PTR]] : !cir.bool, !cir.ptr<!cir.bool>
172+
// CIR: cir.return
173+
174+
// LLVM: define{{.*}} void @_Z10value_initv()
175+
// LLVM: %[[F_PTR:.+]] = alloca float
176+
// LLVM: %[[B_PTR:.+]] = alloca i8
177+
// LLVM: %[[I_PTR:.+]] = alloca i32
178+
// LLVM: %[[F2_PTR:.+]] = alloca float
179+
// LLVM: %[[B2_PTR:.+]] = alloca i8
180+
// LLVM: %[[I2_PTR:.+]] = alloca i32
181+
// LLVM: %[[S_PTR:.+]] = alloca i8
182+
// LLVM: store float 0.000000e+00, ptr %[[F_PTR]]
183+
// LLVM: store i8 0, ptr %[[B_PTR]]
184+
// LLVM: store i32 0, ptr %[[I_PTR]]
185+
// LLVM: store float 0.000000e+00, ptr %[[F2_PTR]]
186+
// LLVM: store i8 0, ptr %[[B2_PTR]]
187+
// LLVM: store i32 0, ptr %[[I2_PTR]]
188+
// LLVM: store i8 1, ptr %[[S_PTR]]
189+
// LLVM: ret void
190+
191+
// OGCG: define{{.*}} void @_Z10value_initv()
192+
// OGCG: %[[F_PTR:.+]] = alloca float
193+
// OGCG: %[[B_PTR:.+]] = alloca i8
194+
// OGCG: %[[I_PTR:.+]] = alloca i32
195+
// OGCG: %[[F2_PTR:.+]] = alloca float
196+
// OGCG: %[[B2_PTR:.+]] = alloca i8
197+
// OGCG: %[[I2_PTR:.+]] = alloca i32
198+
// OGCG: %[[S_PTR:.+]] = alloca i8
199+
// OGCG: store float 0.000000e+00, ptr %[[F_PTR]]
200+
// OGCG: store i8 0, ptr %[[B_PTR]]
201+
// OGCG: store i32 0, ptr %[[I_PTR]]
202+
// OGCG: store float 0.000000e+00, ptr %[[F2_PTR]]
203+
// OGCG: store i8 0, ptr %[[B2_PTR]]
204+
// OGCG: store i32 0, ptr %[[I2_PTR]]
205+
// OGCG: store i8 1, ptr %[[S_PTR]]
206+
// OGCG: ret void

0 commit comments

Comments
 (0)