@@ -55,11 +55,160 @@ mlir::LogicalResult CIRGenFunction::emitStmt(const Stmt *s,
5555 if (mlir::succeeded (emitSimpleStmt (s, useCurrentScope)))
5656 return mlir::success ();
5757
58- // Only a subset of simple statements are supported at the moment. When more
59- // kinds of statements are supported, a
60- // switch (s->getStmtClass()) {
61- // will be added here.
62- return mlir::failure ();
58+ switch (s->getStmtClass ()) {
59+
60+ #define STMT (Type, Base )
61+ #define ABSTRACT_STMT (Op )
62+ #define EXPR (Type, Base ) case Stmt::Type##Class:
63+ #include " clang/AST/StmtNodes.inc"
64+ {
65+ // Remember the block we came in on.
66+ mlir::Block *incoming = builder.getInsertionBlock ();
67+ assert (incoming && " expression emission must have an insertion point" );
68+
69+ emitIgnoredExpr (cast<Expr>(s));
70+
71+ mlir::Block *outgoing = builder.getInsertionBlock ();
72+ assert (outgoing && " expression emission cleared block!" );
73+ return mlir::success ();
74+ }
75+
76+ case Stmt::OMPScopeDirectiveClass:
77+ case Stmt::OMPErrorDirectiveClass:
78+ case Stmt::NoStmtClass:
79+ case Stmt::CXXCatchStmtClass:
80+ case Stmt::SEHExceptStmtClass:
81+ case Stmt::SEHFinallyStmtClass:
82+ case Stmt::MSDependentExistsStmtClass:
83+ case Stmt::NullStmtClass:
84+ case Stmt::CompoundStmtClass:
85+ case Stmt::DeclStmtClass:
86+ case Stmt::LabelStmtClass:
87+ case Stmt::AttributedStmtClass:
88+ case Stmt::GotoStmtClass:
89+ case Stmt::BreakStmtClass:
90+ case Stmt::ContinueStmtClass:
91+ case Stmt::DefaultStmtClass:
92+ case Stmt::CaseStmtClass:
93+ case Stmt::SEHLeaveStmtClass:
94+ case Stmt::SYCLKernelCallStmtClass:
95+ case Stmt::IfStmtClass:
96+ case Stmt::SwitchStmtClass:
97+ case Stmt::ForStmtClass:
98+ case Stmt::WhileStmtClass:
99+ case Stmt::DoStmtClass:
100+ case Stmt::CoroutineBodyStmtClass:
101+ case Stmt::CoreturnStmtClass:
102+ case Stmt::CXXTryStmtClass:
103+ case Stmt::CXXForRangeStmtClass:
104+ case Stmt::IndirectGotoStmtClass:
105+ case Stmt::ReturnStmtClass:
106+ case Stmt::GCCAsmStmtClass:
107+ case Stmt::MSAsmStmtClass:
108+ case Stmt::OMPParallelDirectiveClass:
109+ case Stmt::OMPTaskwaitDirectiveClass:
110+ case Stmt::OMPTaskyieldDirectiveClass:
111+ case Stmt::OMPBarrierDirectiveClass:
112+ case Stmt::CapturedStmtClass:
113+ case Stmt::ObjCAtTryStmtClass:
114+ case Stmt::ObjCAtThrowStmtClass:
115+ case Stmt::ObjCAtSynchronizedStmtClass:
116+ case Stmt::ObjCForCollectionStmtClass:
117+ case Stmt::ObjCAutoreleasePoolStmtClass:
118+ case Stmt::SEHTryStmtClass:
119+ case Stmt::OMPMetaDirectiveClass:
120+ case Stmt::OMPCanonicalLoopClass:
121+ case Stmt::OMPSimdDirectiveClass:
122+ case Stmt::OMPTileDirectiveClass:
123+ case Stmt::OMPUnrollDirectiveClass:
124+ case Stmt::OMPForDirectiveClass:
125+ case Stmt::OMPForSimdDirectiveClass:
126+ case Stmt::OMPSectionsDirectiveClass:
127+ case Stmt::OMPSectionDirectiveClass:
128+ case Stmt::OMPSingleDirectiveClass:
129+ case Stmt::OMPMasterDirectiveClass:
130+ case Stmt::OMPCriticalDirectiveClass:
131+ case Stmt::OMPParallelForDirectiveClass:
132+ case Stmt::OMPParallelForSimdDirectiveClass:
133+ case Stmt::OMPParallelMasterDirectiveClass:
134+ case Stmt::OMPParallelSectionsDirectiveClass:
135+ case Stmt::OMPTaskDirectiveClass:
136+ case Stmt::OMPTaskgroupDirectiveClass:
137+ case Stmt::OMPFlushDirectiveClass:
138+ case Stmt::OMPDepobjDirectiveClass:
139+ case Stmt::OMPScanDirectiveClass:
140+ case Stmt::OMPOrderedDirectiveClass:
141+ case Stmt::OMPAtomicDirectiveClass:
142+ case Stmt::OMPTargetDirectiveClass:
143+ case Stmt::OMPTeamsDirectiveClass:
144+ case Stmt::OMPCancellationPointDirectiveClass:
145+ case Stmt::OMPCancelDirectiveClass:
146+ case Stmt::OMPTargetDataDirectiveClass:
147+ case Stmt::OMPTargetEnterDataDirectiveClass:
148+ case Stmt::OMPTargetExitDataDirectiveClass:
149+ case Stmt::OMPTargetParallelDirectiveClass:
150+ case Stmt::OMPTargetParallelForDirectiveClass:
151+ case Stmt::OMPTaskLoopDirectiveClass:
152+ case Stmt::OMPTaskLoopSimdDirectiveClass:
153+ case Stmt::OMPMaskedTaskLoopDirectiveClass:
154+ case Stmt::OMPMaskedTaskLoopSimdDirectiveClass:
155+ case Stmt::OMPMasterTaskLoopDirectiveClass:
156+ case Stmt::OMPMasterTaskLoopSimdDirectiveClass:
157+ case Stmt::OMPParallelGenericLoopDirectiveClass:
158+ case Stmt::OMPParallelMaskedDirectiveClass:
159+ case Stmt::OMPParallelMaskedTaskLoopDirectiveClass:
160+ case Stmt::OMPParallelMaskedTaskLoopSimdDirectiveClass:
161+ case Stmt::OMPParallelMasterTaskLoopDirectiveClass:
162+ case Stmt::OMPParallelMasterTaskLoopSimdDirectiveClass:
163+ case Stmt::OMPDistributeDirectiveClass:
164+ case Stmt::OMPDistributeParallelForDirectiveClass:
165+ case Stmt::OMPDistributeParallelForSimdDirectiveClass:
166+ case Stmt::OMPDistributeSimdDirectiveClass:
167+ case Stmt::OMPTargetParallelGenericLoopDirectiveClass:
168+ case Stmt::OMPTargetParallelForSimdDirectiveClass:
169+ case Stmt::OMPTargetSimdDirectiveClass:
170+ case Stmt::OMPTargetTeamsGenericLoopDirectiveClass:
171+ case Stmt::OMPTargetUpdateDirectiveClass:
172+ case Stmt::OMPTeamsDistributeDirectiveClass:
173+ case Stmt::OMPTeamsDistributeSimdDirectiveClass:
174+ case Stmt::OMPTeamsDistributeParallelForSimdDirectiveClass:
175+ case Stmt::OMPTeamsDistributeParallelForDirectiveClass:
176+ case Stmt::OMPTeamsGenericLoopDirectiveClass:
177+ case Stmt::OMPTargetTeamsDirectiveClass:
178+ case Stmt::OMPTargetTeamsDistributeDirectiveClass:
179+ case Stmt::OMPTargetTeamsDistributeParallelForDirectiveClass:
180+ case Stmt::OMPTargetTeamsDistributeParallelForSimdDirectiveClass:
181+ case Stmt::OMPTargetTeamsDistributeSimdDirectiveClass:
182+ case Stmt::OMPInteropDirectiveClass:
183+ case Stmt::OMPDispatchDirectiveClass:
184+ case Stmt::OMPGenericLoopDirectiveClass:
185+ case Stmt::OMPReverseDirectiveClass:
186+ case Stmt::OMPInterchangeDirectiveClass:
187+ case Stmt::OMPAssumeDirectiveClass:
188+ case Stmt::OMPMaskedDirectiveClass:
189+ case Stmt::OMPStripeDirectiveClass:
190+ case Stmt::OpenACCComputeConstructClass:
191+ case Stmt::OpenACCLoopConstructClass:
192+ case Stmt::OpenACCCombinedConstructClass:
193+ case Stmt::OpenACCDataConstructClass:
194+ case Stmt::OpenACCEnterDataConstructClass:
195+ case Stmt::OpenACCExitDataConstructClass:
196+ case Stmt::OpenACCHostDataConstructClass:
197+ case Stmt::OpenACCWaitConstructClass:
198+ case Stmt::OpenACCInitConstructClass:
199+ case Stmt::OpenACCShutdownConstructClass:
200+ case Stmt::OpenACCSetConstructClass:
201+ case Stmt::OpenACCUpdateConstructClass:
202+ case Stmt::OpenACCCacheConstructClass:
203+ case Stmt::OpenACCAtomicConstructClass:
204+ case Stmt::ObjCAtCatchStmtClass:
205+ case Stmt::ObjCAtFinallyStmtClass:
206+ cgm.errorNYI (s->getSourceRange (),
207+ std::string (" emitStmt: " ) + s->getStmtClassName ());
208+ return mlir::failure ();
209+ }
210+
211+ llvm_unreachable (" Unexpected statement class" );
63212}
64213
65214mlir::LogicalResult CIRGenFunction::emitSimpleStmt (const Stmt *s,
@@ -106,16 +255,11 @@ mlir::LogicalResult CIRGenFunction::emitReturnStmt(const ReturnStmt &s) {
106255 // this section will do nothing. But for now a ReturnOp is necessary.
107256 builder.create <ReturnOp>(loc);
108257 } else if (rv->getType ()->isVoidType ()) {
109- // No return value. Emit the return expression for its side effects.
110- // TODO(CIR): Once emitAnyExpr(e) has been upstreamed, get rid of the check
111- // and just call emitAnyExpr(rv) here.
112- if (CIRGenFunction::hasScalarEvaluationKind (rv->getType ())) {
113- emitScalarExpr (rv);
114- } else {
115- getCIRGenModule ().errorNYI (s.getSourceRange (),
116- " non-scalar function return type" );
258+ // Make sure not to return anything, but evaluate the expression
259+ // for side effects.
260+ if (rv) {
261+ emitAnyExpr (rv);
117262 }
118- builder.create <ReturnOp>(loc);
119263 } else if (fnRetTy->isReferenceType ()) {
120264 getCIRGenModule ().errorNYI (s.getSourceRange (),
121265 " function return type that is a reference" );
0 commit comments