Skip to content

Commit dea1965

Browse files
committed
Merge branch 'support_new_offset_format' into add_test_pass_for_simt_distribution
2 parents 9063f1e + 03522d9 commit dea1965

File tree

129 files changed

+12315
-11842
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+12315
-11842
lines changed

.github/workflows/pr-code-lint.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@ jobs:
4747
echo "Changed files:"
4848
echo "$CHANGED_FILES"
4949
50+
# The clang tidy version should always be upgraded to the first version
51+
# of a release cycle (x.1.0) or the last version of a release cycle, or
52+
# if there have been relevant clang-format backports.
5053
- name: Install clang-tidy
5154
uses: aminya/setup-cpp@17c11551771948abc5752bbf3183482567c7caf0 # v1.1.1
5255
with:
53-
clang-tidy: 20.1.8
56+
clang-tidy: 21.1.0
5457

5558
- name: Setup Python env
5659
uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ Bug Fixes to C++ Support
422422
``__builtin_addressof``, and related issues with builtin arguments. (#GH154034)
423423
- Fix an assertion failure when taking the address on a non-type template parameter argument of
424424
object type. (#GH151531)
425+
- Suppress ``-Wdouble-promotion`` when explicitly asked for with C++ list initialization (#GH33409).
425426

426427
Bug Fixes to AST Handling
427428
^^^^^^^^^^^^^^^^^^^^^^^^^

clang/lib/Analysis/FlowSensitive/Transfer.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,12 @@ class TransferVisitor : public ConstStmtVisitor<TransferVisitor> {
657657
if (LocSrc == nullptr || LocDst == nullptr)
658658
return;
659659

660-
copyRecord(*LocSrc, *LocDst, Env);
660+
// If the destination object here is of a derived class, `Arg0` may be a
661+
// cast of that object to a base class, and the source object may be of a
662+
// sibling derived class. To handle these cases, ensure we are copying
663+
// only the fields for `Arg0`'s type, not the type of the underlying
664+
// `RecordStorageLocation`.
665+
copyRecord(*LocSrc, *LocDst, Env, Arg0->getType());
661666

662667
// The assignment operator can have an arbitrary return type. We model the
663668
// return value only if the return type is the same as or a base class of

clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2140,11 +2140,23 @@ mlir::Value ScalarExprEmitter::VisitRealImag(const UnaryOperator *e,
21402140
: builder.createComplexImag(loc, complex);
21412141
}
21422142

2143-
// __real or __imag on a scalar returns zero. Emit the subexpr to ensure side
2143+
if (e->getOpcode() == UO_Real) {
2144+
return promotionTy.isNull() ? Visit(op)
2145+
: cgf.emitPromotedScalarExpr(op, promotionTy);
2146+
}
2147+
2148+
// __imag on a scalar returns zero. Emit the subexpr to ensure side
21442149
// effects are evaluated, but not the actual value.
2145-
cgf.cgm.errorNYI(e->getSourceRange(),
2146-
"VisitRealImag __real or __imag on a scalar");
2147-
return {};
2150+
if (op->isGLValue())
2151+
cgf.emitLValue(op);
2152+
else if (!promotionTy.isNull())
2153+
cgf.emitPromotedScalarExpr(op, promotionTy);
2154+
else
2155+
cgf.emitScalarExpr(op);
2156+
2157+
mlir::Type valueTy =
2158+
cgf.convertType(promotionTy.isNull() ? e->getType() : promotionTy);
2159+
return builder.getNullValue(valueTy, loc);
21482160
}
21492161

21502162
/// Return the size or alignment of the type of argument of the sizeof

clang/lib/CIR/CodeGen/CIRGenFunction.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1716,6 +1716,10 @@ class CIRGenFunction : public CIRGenTypeCache {
17161716
~ActiveOpenACCLoopRAII() { cgf.activeLoopOp = oldLoopOp; }
17171717
};
17181718

1719+
// Keep track of the last place we inserted a 'recipe' so that we can insert
1720+
// the next one in lexical order.
1721+
mlir::OpBuilder::InsertPoint lastRecipeLocation;
1722+
17191723
public:
17201724
// Helper type used to store the list of important information for a 'data'
17211725
// clause variable, or a 'cache' variable reference.
@@ -1733,6 +1737,7 @@ class CIRGenFunction : public CIRGenTypeCache {
17331737
// can use to properly set the alloca section.
17341738
llvm::SmallVector<QualType> boundTypes;
17351739
};
1740+
17361741
// Gets the collection of info required to lower and OpenACC clause or cache
17371742
// construct variable reference.
17381743
OpenACCDataOperandInfo getOpenACCDataOperandInfo(const Expr *e);

clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class OpenACCClauseCIREmitter final
5353
template <typename FriendOpTy> friend class OpenACCClauseCIREmitter;
5454

5555
OpTy &operation;
56+
mlir::OpBuilder::InsertPoint &recipeInsertLocation;
5657
CIRGen::CIRGenFunction &cgf;
5758
CIRGen::CIRGenBuilderTy &builder;
5859

@@ -148,7 +149,7 @@ class OpenACCClauseCIREmitter final
148149
mlir::OpBuilder::InsertionGuard guardCase(builder);
149150
builder.setInsertionPoint(operation.loopOp);
150151
OpenACCClauseCIREmitter<mlir::acc::LoopOp> loopEmitter{
151-
operation.loopOp, cgf, builder, dirKind, dirLoc};
152+
operation.loopOp, recipeInsertLocation, cgf, builder, dirKind, dirLoc};
152153
loopEmitter.lastDeviceTypeValues = lastDeviceTypeValues;
153154
loopEmitter.Visit(&c);
154155
}
@@ -159,7 +160,12 @@ class OpenACCClauseCIREmitter final
159160
mlir::OpBuilder::InsertionGuard guardCase(builder);
160161
builder.setInsertionPoint(operation.computeOp);
161162
OpenACCClauseCIREmitter<typename OpTy::ComputeOpTy> computeEmitter{
162-
operation.computeOp, cgf, builder, dirKind, dirLoc};
163+
operation.computeOp,
164+
recipeInsertLocation,
165+
cgf,
166+
builder,
167+
dirKind,
168+
dirLoc};
163169

164170
computeEmitter.lastDeviceTypeValues = lastDeviceTypeValues;
165171

@@ -358,11 +364,13 @@ class OpenACCClauseCIREmitter final
358364
}
359365

360366
public:
361-
OpenACCClauseCIREmitter(OpTy &operation, CIRGen::CIRGenFunction &cgf,
367+
OpenACCClauseCIREmitter(OpTy &operation,
368+
mlir::OpBuilder::InsertPoint &recipeInsertLocation,
369+
CIRGen::CIRGenFunction &cgf,
362370
CIRGen::CIRGenBuilderTy &builder,
363371
OpenACCDirectiveKind dirKind, SourceLocation dirLoc)
364-
: operation(operation), cgf(cgf), builder(builder), dirKind(dirKind),
365-
dirLoc(dirLoc) {}
372+
: operation(operation), recipeInsertLocation(recipeInsertLocation),
373+
cgf(cgf), builder(builder), dirKind(dirKind), dirLoc(dirLoc) {}
366374

367375
void VisitClause(const OpenACCClause &clause) {
368376
clauseNotImplemented(clause);
@@ -992,8 +1000,8 @@ class OpenACCClauseCIREmitter final
9921000
auto recipe =
9931001
OpenACCRecipeBuilder<mlir::acc::PrivateRecipeOp>(cgf, builder)
9941002
.getOrCreateRecipe(
995-
cgf.getContext(), varExpr, varRecipe.AllocaDecl,
996-
varRecipe.InitExpr,
1003+
cgf.getContext(), recipeInsertLocation, varExpr,
1004+
varRecipe.AllocaDecl, varRecipe.InitExpr,
9971005
/*temporary=*/nullptr, OpenACCReductionOperator::Invalid,
9981006
Decl::castToDeclContext(cgf.curFuncDecl), opInfo.origType,
9991007
opInfo.bounds.size(), opInfo.boundTypes, opInfo.baseType,
@@ -1039,8 +1047,9 @@ class OpenACCClauseCIREmitter final
10391047
OpenACCRecipeBuilder<mlir::acc::FirstprivateRecipeOp>(cgf,
10401048
builder)
10411049
.getOrCreateRecipe(
1042-
cgf.getContext(), varExpr, varRecipe.AllocaDecl,
1043-
varRecipe.InitExpr, varRecipe.InitFromTemporary,
1050+
cgf.getContext(), recipeInsertLocation, varExpr,
1051+
varRecipe.AllocaDecl, varRecipe.InitExpr,
1052+
varRecipe.InitFromTemporary,
10441053
OpenACCReductionOperator::Invalid,
10451054
Decl::castToDeclContext(cgf.curFuncDecl), opInfo.origType,
10461055
opInfo.bounds.size(), opInfo.boundTypes, opInfo.baseType,
@@ -1087,8 +1096,8 @@ class OpenACCClauseCIREmitter final
10871096
auto recipe =
10881097
OpenACCRecipeBuilder<mlir::acc::ReductionRecipeOp>(cgf, builder)
10891098
.getOrCreateRecipe(
1090-
cgf.getContext(), varExpr, varRecipe.AllocaDecl,
1091-
varRecipe.InitExpr,
1099+
cgf.getContext(), recipeInsertLocation, varExpr,
1100+
varRecipe.AllocaDecl, varRecipe.InitExpr,
10921101
/*temporary=*/nullptr, clause.getReductionOp(),
10931102
Decl::castToDeclContext(cgf.curFuncDecl), opInfo.origType,
10941103
opInfo.bounds.size(), opInfo.boundTypes, opInfo.baseType,
@@ -1108,10 +1117,13 @@ class OpenACCClauseCIREmitter final
11081117
};
11091118

11101119
template <typename OpTy>
1111-
auto makeClauseEmitter(OpTy &op, CIRGen::CIRGenFunction &cgf,
1120+
auto makeClauseEmitter(OpTy &op,
1121+
mlir::OpBuilder::InsertPoint &recipeInsertLocation,
1122+
CIRGen::CIRGenFunction &cgf,
11121123
CIRGen::CIRGenBuilderTy &builder,
11131124
OpenACCDirectiveKind dirKind, SourceLocation dirLoc) {
1114-
return OpenACCClauseCIREmitter<OpTy>(op, cgf, builder, dirKind, dirLoc);
1125+
return OpenACCClauseCIREmitter<OpTy>(op, recipeInsertLocation, cgf, builder,
1126+
dirKind, dirLoc);
11151127
}
11161128
} // namespace
11171129

@@ -1124,7 +1136,8 @@ void CIRGenFunction::emitOpenACCClauses(
11241136
// Sets insertion point before the 'op', since every new expression needs to
11251137
// be before the operation.
11261138
builder.setInsertionPoint(op);
1127-
makeClauseEmitter(op, *this, builder, dirKind, dirLoc).emitClauses(clauses);
1139+
makeClauseEmitter(op, lastRecipeLocation, *this, builder, dirKind, dirLoc)
1140+
.emitClauses(clauses);
11281141
}
11291142

11301143
#define EXPL_SPEC(N) \
@@ -1156,7 +1169,8 @@ void CIRGenFunction::emitOpenACCClauses(
11561169
// We cannot set the insertion point here and do so in the emitter, but make
11571170
// sure we reset it with the 'guard' anyway.
11581171
mlir::OpBuilder::InsertionGuard guardCase(builder);
1159-
makeClauseEmitter(inf, *this, builder, dirKind, dirLoc).emitClauses(clauses);
1172+
makeClauseEmitter(inf, lastRecipeLocation, *this, builder, dirKind, dirLoc)
1173+
.emitClauses(clauses);
11601174
}
11611175

11621176
#define EXPL_SPEC(N) \

clang/lib/CIR/CodeGen/CIRGenOpenACCRecipe.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,9 +469,10 @@ template <typename RecipeTy> class OpenACCRecipeBuilder {
469469
OpenACCRecipeBuilder(CIRGen::CIRGenFunction &cgf,
470470
CIRGen::CIRGenBuilderTy &builder)
471471
: cgf(cgf), builder(builder) {}
472-
RecipeTy getOrCreateRecipe(ASTContext &astCtx, const Expr *varRef,
473-
const VarDecl *varRecipe, const Expr *initExpr,
474-
const VarDecl *temporary,
472+
RecipeTy getOrCreateRecipe(ASTContext &astCtx,
473+
mlir::OpBuilder::InsertPoint &insertLocation,
474+
const Expr *varRef, const VarDecl *varRecipe,
475+
const Expr *initExpr, const VarDecl *temporary,
475476
OpenACCReductionOperator reductionOp,
476477
DeclContext *dc, QualType origType,
477478
size_t numBounds,
@@ -507,6 +508,8 @@ template <typename RecipeTy> class OpenACCRecipeBuilder {
507508
mlir::Location locEnd = cgf.cgm.getLoc(varRef->getEndLoc());
508509

509510
mlir::OpBuilder modBuilder(mod.getBodyRegion());
511+
if (insertLocation.isSet())
512+
modBuilder.restoreInsertionPoint(insertLocation);
510513
RecipeTy recipe;
511514

512515
if constexpr (std::is_same_v<RecipeTy, mlir::acc::ReductionRecipeOp>) {
@@ -515,6 +518,7 @@ template <typename RecipeTy> class OpenACCRecipeBuilder {
515518
} else {
516519
recipe = RecipeTy::create(modBuilder, loc, recipeName, mainOp.getType());
517520
}
521+
insertLocation = modBuilder.saveInsertionPoint();
518522

519523
if constexpr (std::is_same_v<RecipeTy, mlir::acc::PrivateRecipeOp>) {
520524
createPrivateInitRecipe(loc, locEnd, varRef->getSourceRange(), mainOp,

clang/lib/Sema/SemaChecking.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13043,7 +13043,19 @@ static void AnalyzeImplicitConversions(
1304313043

1304413044
// Skip past explicit casts.
1304513045
if (auto *CE = dyn_cast<ExplicitCastExpr>(E)) {
13046-
E = CE->getSubExpr()->IgnoreParenImpCasts();
13046+
E = CE->getSubExpr();
13047+
// In the special case of a C++ function-style cast with braces,
13048+
// CXXFunctionalCastExpr has an InitListExpr as direct child with a single
13049+
// initializer. This InitListExpr basically belongs to the cast itself, so
13050+
// we skip it too. Specifically this is needed to silence -Wdouble-promotion
13051+
if (isa<CXXFunctionalCastExpr>(CE)) {
13052+
if (auto *InitListE = dyn_cast<InitListExpr>(E)) {
13053+
if (InitListE->getNumInits() == 1) {
13054+
E = InitListE->getInit(0);
13055+
}
13056+
}
13057+
}
13058+
E = E->IgnoreParenImpCasts();
1304713059
if (!CE->getType()->isVoidType() && E->getType()->isAtomicType())
1304813060
S.Diag(E->getBeginLoc(), diag::warn_atomic_implicit_seq_cst);
1304913061
WorkList.push_back({E, CC, IsListInit});

clang/test/CIR/CodeGen/complex.cpp

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1092,4 +1092,106 @@ void imag_on_non_glvalue() {
10921092
// OGCG: %[[A_REAL:.*]] = load float, ptr %[[A_REAL_PTR]], align 4
10931093
// OGCG: %[[A_IMAG_PTR:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[A_ADDR]], i32 0, i32 1
10941094
// OGCG: %[[A_IMAG:.*]] = load float, ptr %[[A_IMAG_PTR]], align 4
1095-
// OGCG: store float %[[A_IMAG]], ptr %[[B_ADDR]], align 4
1095+
// OGCG: store float %[[A_IMAG]], ptr %[[B_ADDR]], align 4
1096+
1097+
void real_on_scalar_glvalue() {
1098+
float a;
1099+
float b = __real__ a;
1100+
}
1101+
1102+
// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["a"]
1103+
// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["b", init]
1104+
// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.float>, !cir.float
1105+
// CIR: cir.store{{.*}} %[[TMP_A]], %[[B_ADDR]] : !cir.float, !cir.ptr<!cir.float>
1106+
1107+
// LLVM: %[[A_ADDR:.*]] = alloca float, i64 1, align 4
1108+
// LLVM: %[[B_ADDR:.*]] = alloca float, i64 1, align 4
1109+
// LLVM: %[[TMP_A:.*]] = load float, ptr %[[A_ADDR]], align 4
1110+
// LLVM: store float %[[TMP_A]], ptr %[[B_ADDR]], align 4
1111+
1112+
// OGCG: %[[A_ADDR:.*]] = alloca float, align 4
1113+
// OGCG: %[[B_ADDR:.*]] = alloca float, align 4
1114+
// OGCG: %[[TMP_A:.*]] = load float, ptr %[[A_ADDR]], align 4
1115+
// OGCG: store float %[[TMP_A]], ptr %[[B_ADDR]], align 4
1116+
1117+
void imag_on_scalar_glvalue() {
1118+
float a;
1119+
float b = __imag__ a;
1120+
}
1121+
1122+
// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["a"]
1123+
// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["b", init]
1124+
// CIR: %[[CONST_ZERO:.*]] = cir.const #cir.fp<0.000000e+00> : !cir.float
1125+
// CIR: cir.store{{.*}} %[[CONST_ZERO]], %[[B_ADDR]] : !cir.float, !cir.ptr<!cir.float>
1126+
1127+
// LLVM: %[[A_ADDR:.*]] = alloca float, i64 1, align 4
1128+
// LLVM: %[[B_ADDR:.*]] = alloca float, i64 1, align 4
1129+
// LLVM: store float 0.000000e+00, ptr %[[B_ADDR]], align 4
1130+
1131+
// OGCG: %[[A_ADDR:.*]] = alloca float, align 4
1132+
// OGCG: %[[B_ADDR:.*]] = alloca float, align 4
1133+
// OGCG: store float 0.000000e+00, ptr %[[B_ADDR]], align 4
1134+
1135+
void real_on_scalar_with_type_promotion() {
1136+
_Float16 a;
1137+
_Float16 b = __real__ a;
1138+
}
1139+
1140+
// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["a"]
1141+
// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["b", init]
1142+
// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.f16>, !cir.f16
1143+
// CIR: %[[TMP_A_F32:.*]] = cir.cast(floating, %[[TMP_A]] : !cir.f16), !cir.float
1144+
// CIR: %[[TMP_A_F16:.*]] = cir.cast(floating, %[[TMP_A_F32]] : !cir.float), !cir.f16
1145+
// CIR: cir.store{{.*}} %[[TMP_A_F16]], %[[B_ADDR]] : !cir.f16, !cir.ptr<!cir.f16>
1146+
1147+
// LLVM: %[[A_ADDR:.*]] = alloca half, i64 1, align 2
1148+
// LLVM: %[[B_ADDR:.*]] = alloca half, i64 1, align 2
1149+
// LLVM: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
1150+
// LLVM: %[[TMP_A_F32:.*]] = fpext half %[[TMP_A]] to float
1151+
// LLVM: %[[TMP_A_F16:.*]] = fptrunc float %[[TMP_A_F32]] to half
1152+
// LLVM: store half %[[TMP_A_F16]], ptr %[[B_ADDR]], align 2
1153+
1154+
// OGCG: %[[A_ADDR:.*]] = alloca half, align 2
1155+
// OGCG: %[[B_ADDR:.*]] = alloca half, align 2
1156+
// OGCG: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
1157+
// OGCG: %[[TMP_A_F32:.*]] = fpext half %[[TMP_A]] to float
1158+
// OGCG: %[[TMP_A_F16:.*]] = fptrunc float %[[TMP_A_F32]] to half
1159+
// OGCG: store half %[[TMP_A_F16]], ptr %[[B_ADDR]], align 2
1160+
1161+
void imag_on_scalar_with_type_promotion() {
1162+
_Float16 a;
1163+
_Float16 b = __imag__ a;
1164+
}
1165+
1166+
// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["a"]
1167+
// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["b", init]
1168+
// CIR: %[[CONST_ZERO:.*]] = cir.const #cir.fp<0.000000e+00> : !cir.float
1169+
// CIR: %[[CONST_ZERO_F16:.*]] = cir.cast(floating, %[[CONST_ZERO]] : !cir.float), !cir.f16
1170+
// CIR: cir.store{{.*}} %[[CONST_ZERO_F16]], %[[B_ADDR]] : !cir.f16, !cir.ptr<!cir.f16>
1171+
1172+
// LLVM: %[[A_ADDR:.*]] = alloca half, i64 1, align 2
1173+
// LLVM: %[[B_ADDR:.*]] = alloca half, i64 1, align 2
1174+
// LLVM: store half 0xH0000, ptr %[[B_ADDR]], align 2
1175+
1176+
// OGCG: %[[A_ADDR:.*]] = alloca half, align 2
1177+
// OGCG: %[[B_ADDR:.*]] = alloca half, align 2
1178+
// OGCG: store half 0xH0000, ptr %[[B_ADDR]], align 2
1179+
1180+
void imag_on_const_scalar() {
1181+
float a;
1182+
float b = __imag__ 1.0f;
1183+
}
1184+
1185+
// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["a"]
1186+
// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["b", init]
1187+
// CIR: %[[CONST_ONE:.*]] = cir.const #cir.fp<1.000000e+00> : !cir.float
1188+
// CIR: %[[CONST_ZERO:.*]] = cir.const #cir.fp<0.000000e+00> : !cir.float
1189+
// CIR: cir.store{{.*}} %[[CONST_ZERO]], %[[B_ADDR]] : !cir.float, !cir.ptr<!cir.float>
1190+
1191+
// LLVM: %[[A_ADDR:.*]] = alloca float, i64 1, align 4
1192+
// LLVM: %[[B_ADDR:.*]] = alloca float, i64 1, align 4
1193+
// LLVM: store float 0.000000e+00, ptr %[[B_ADDR]], align 4
1194+
1195+
// OGCG: %[[A_ADDR:.*]] = alloca float, align 4
1196+
// OGCG: %[[B_ADDR:.*]] = alloca float, align 4
1197+
// OGCG: store float 0.000000e+00, ptr %[[B_ADDR]], align 4

0 commit comments

Comments
 (0)