Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 3aec25fe8a13c9e5e36e9559a2bffc76634de1bc)
+++ src/Parser/ParseNode.h	(revision 76d73fc8570bdc8cdfe063abd75851b37ac7d58b)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul  6 09:33:32 2020
-// Update Count     : 892
+// Last Modified On : Sat Oct 24 03:53:54 2020
+// Update Count     : 895
 //
 
@@ -205,6 +205,5 @@
 struct TypeData;
 
-class DeclarationNode : public ParseNode {
-  public:
+struct DeclarationNode : public ParseNode {
 	// These enumerations must harmonize with their names in DeclarationNode.cc.
 	enum BasicType { Void, Bool, Char, Int, Int128,
@@ -304,5 +303,5 @@
 	bool get_inLine() const { return inLine; }
 	DeclarationNode * set_inLine( bool inL ) { inLine = inL; return this; }
-  public:
+
 	DeclarationNode * get_last() { return (DeclarationNode *)ParseNode::get_last(); }
 
@@ -360,6 +359,5 @@
 //##############################################################################
 
-class StatementNode final : public ParseNode {
-  public:
+struct StatementNode final : public ParseNode {
 	StatementNode() { stmt = nullptr; }
 	StatementNode( Statement * stmt ) : stmt( stmt ) {}
@@ -382,5 +380,5 @@
 		os << stmt.get() << std::endl;
 	}
-  private:
+
 	std::unique_ptr<Statement> stmt;
 }; // StatementNode
@@ -426,4 +424,5 @@
 Statement * build_finally( StatementNode * stmt );
 Statement * build_compound( StatementNode * first );
+StatementNode * maybe_build_compound( StatementNode * first );
 Statement * build_asm( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
 Statement * build_directive( std::string * directive );
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 3aec25fe8a13c9e5e36e9559a2bffc76634de1bc)
+++ src/Parser/StatementNode.cc	(revision 76d73fc8570bdc8cdfe063abd75851b37ac7d58b)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:59:41 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug  4 09:39:25 2018
-// Update Count     : 363
+// Last Modified On : Sat Oct 24 04:20:55 2020
+// Update Count     : 383
 //
 
@@ -345,4 +345,19 @@
 } // build_compound
 
+// A single statement in a control structure is always converted to a compound statement so subsequent generated code
+// can be placed within this compound statement. Otherwise, code generation has to constantly check for a single
+// statement and wrap it into a compound statement to insert additional code. Hence, all control structures have a
+// conical form for code generation.
+StatementNode * maybe_build_compound( StatementNode * first ) {
+	// Optimization: if the control-structure statement is a compound statement, do not wrap it.
+	// e.g., if (...) {...} do not wrap the existing compound statement.
+	if ( ! dynamic_cast<CompoundStmt *>( first->stmt.get() ) ) { // unique_ptr
+		CompoundStmt * cs = new CompoundStmt();
+		buildMoveList( first, cs->get_kids() );
+		return new StatementNode( cs );
+	} // if
+	return first;
+} // maybe_build_compound
+
 Statement * build_asm( bool voltile, Expression * instruction, ExpressionNode * output, ExpressionNode * input, ExpressionNode * clobber, LabelNode * gotolabels ) {
 	std::list< Expression * > out, in;
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 3aec25fe8a13c9e5e36e9559a2bffc76634de1bc)
+++ src/Parser/parser.yy	(revision 76d73fc8570bdc8cdfe063abd75851b37ac7d58b)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Oct  9 18:09:09 2020
-// Update Count     : 4614
+// Last Modified On : Sat Oct 24 08:21:14 2020
+// Update Count     : 4624
 //
 
@@ -1080,7 +1080,7 @@
 	IF '(' if_control_expression ')' statement			%prec THEN
 		// explicitly deal with the shift/reduce conflict on if/else
-		{ $$ = new StatementNode( build_if( $3, $5, nullptr ) ); }
+		{ $$ = new StatementNode( build_if( $3, maybe_build_compound( $5 ), nullptr ) ); }
 	| IF '(' if_control_expression ')' statement ELSE statement
-		{ $$ = new StatementNode( build_if( $3, $5, $7 ) ); }
+		{ $$ = new StatementNode( build_if( $3, maybe_build_compound( $5 ), maybe_build_compound( $7 ) ) ); }
 	;
 
@@ -1130,5 +1130,5 @@
 
 case_clause:											// CFA
-	case_label_list statement					{ $$ = $1->append_last_case( new StatementNode( build_compound( $2 ) ) ); }
+	case_label_list statement					{ $$ = $1->append_last_case( maybe_build_compound( $2 ) ); }
 	;
 
@@ -1148,15 +1148,15 @@
 iteration_statement:
 	WHILE '(' push if_control_expression ')' statement pop
-		{ $$ = new StatementNode( build_while( $4, $6 ) ); }
+		{ $$ = new StatementNode( build_while( $4, maybe_build_compound( $6 ) ) ); }
 	| WHILE '(' ')' statement							// CFA => while ( 1 )
-		{ $$ = new StatementNode( build_while( new IfCtrl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), $4 ) ); }
+		{ $$ = new StatementNode( build_while( new IfCtrl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), maybe_build_compound( $4 ) ) ); }
 	| DO statement WHILE '(' comma_expression ')' ';'
-		{ $$ = new StatementNode( build_do_while( $5, $2 ) ); }
+		{ $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ) ) ); }
 	| DO statement WHILE '(' ')' ';'					// CFA => do while( 1 )
-		{ $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), $2 ) ); }
+		{ $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), maybe_build_compound( $2 ) ) ); }
 	| FOR '(' push for_control_expression_list ')' statement pop
-		{ $$ = new StatementNode( build_for( $4, $6 ) ); }
+		{ $$ = new StatementNode( build_for( $4, maybe_build_compound( $6 ) ) ); }
 	| FOR '(' ')' statement								// CFA => for ( ;; )
-		{ $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), $4 ) ); }
+		{ $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) ); }
 	;
 
@@ -1341,16 +1341,16 @@
 waitfor_clause:
 	when_clause_opt waitfor statement					%prec THEN
- 		{ $$ = build_waitfor( $2, $3, $1 ); }
+		{ $$ = build_waitfor( $2, maybe_build_compound( $3 ), $1 ); }
 	| when_clause_opt waitfor statement WOR waitfor_clause
- 		{ $$ = build_waitfor( $2, $3, $1, $5 ); }
+		{ $$ = build_waitfor( $2, maybe_build_compound( $3 ), $1, $5 ); }
 	| when_clause_opt timeout statement					%prec THEN
- 		{ $$ = build_waitfor_timeout( $2, $3, $1 ); }
+		{ $$ = build_waitfor_timeout( $2, maybe_build_compound( $3 ), $1 ); }
 	| when_clause_opt ELSE statement
- 		{ $$ = build_waitfor_timeout( nullptr, $3, $1 ); }
+		{ $$ = build_waitfor_timeout( nullptr, maybe_build_compound( $3 ), $1 ); }
 		// "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless)
 	| when_clause_opt timeout statement WOR ELSE statement
 		{ SemanticError( yylloc, "else clause must be conditional after timeout or timeout never triggered." ); $$ = nullptr; }
 	| when_clause_opt timeout statement WOR when_clause ELSE statement
- 		{ $$ = build_waitfor_timeout( $2, $3, $1, $7, $5 ); }
+		{ $$ = build_waitfor_timeout( $2, maybe_build_compound( $3 ), $1, maybe_build_compound( $7 ), $5 ); }
 	;
 
