public inbox for cgen@sourceware.org
 help / color / mirror / Atom feed
* [commit] gcc's statement expressions for sequences
@ 2009-11-21 17:42 Doug Evans
  0 siblings, 0 replies; only message in thread
From: Doug Evans @ 2009-11-21 17:42 UTC (permalink / raw)
  To: cgen

Hi.

I checked this patch in.
cgen was emitting bad code when a non-void-mode sequence has
multiple statements in it.

2009-11-21  Doug Evans  <dje@sebabeach.org>

	* rtl-c.scm (s-sequence): Use gcc's statement expressions for
	non-VOID-mode expressions with multiple statements.

Index: rtl-c.scm
===================================================================
RCS file: /cvs/src/src/cgen/rtl-c.scm,v
retrieving revision 1.26
diff -u -p -r1.26 rtl-c.scm
--- rtl-c.scm	12 Nov 2009 16:05:29 -0000	1.26
+++ rtl-c.scm	21 Nov 2009 08:27:35 -0000
@@ -1244,47 +1244,54 @@
 		 ))))
 )
 
-; Return a <c-expr> node for a `sequence'.
-; MODE is the mode name.
+;; Return a <c-expr> node for a `sequence'.
+;; MODE is the mode name.
 
 (define (s-sequence estate mode env . exprs)
-  (let* ((env (rtx-env-make-locals env)) ; compile env
+  (let* ((env (rtx-env-make-locals env)) ;; compile env
 	 (estate (estate-push-env estate env)))
+
     (if (or (mode:eq? 'DFLT mode) ;; FIXME: DFLT can't appear anymore
 	    (mode:eq? 'VOID mode))
+
 	(cx:make VOID
 		 (string-append 
-		  ; ??? do {} while (0); doesn't get "optimized out"
-		  ; internally by gcc, meaning two labels and a loop are
-		  ; created for it to have to process.  We can generate pretty
-		  ; big files and can cause gcc to require *lots* of memory.
-		  ; So let's try just {} ...
+		  ;; ??? do {} while (0); doesn't get "optimized out"
+		  ;; internally by gcc, meaning two labels and a loop are
+		  ;; created for it to have to process.  We can generate pretty
+		  ;; big files and can cause gcc to require *lots* of memory.
+		  ;; So let's try just {} ...
 		  "{\n"
 		  (gen-temp-defs estate env)
 		  (string-map (lambda (e)
 				(rtl-c-with-estate estate VOID e))
 			      exprs)
 		  "}\n"))
-	(cx:make mode
-		 (string-append
-		  ; Don't use GCC extension unless necessary.
-		  (if (rtx-env-empty? env) "(" "({ ")
-		  (gen-temp-defs estate env)
-		  (string-drop 2
-			       (string-map
-				(lambda (e)
-				  (string-append
-				   (if (rtx-env-empty? env) ", " "; ")
-				   ; Strip off gratuitous ";\n" at end of expressions that
-				   ; misguessed themselves to be in statement context.
-				   ; See s-c-call, s-c-call-raw above.
-				   (let ((substmt (rtl-c-with-estate estate DFLT e)))
-				     (if (and (rtx-env-empty? env)
-					      (string=? (string-take -2 substmt) ";\n"))
-					 (string-drop -2 substmt)
-					 substmt))))
-				exprs))
-		  (if (rtx-env-empty? env) ")" "; })")))))
+
+	(let (
+	      ;; Don't use GCC extension unless necessary.
+	      (use-stmt-expr? (or (not (rtx-env-empty? env))
+				  (> (length exprs) 1)))
+	      )
+	  (cx:make mode
+		   (string-append
+		    (if use-stmt-expr? "({ " "(")
+		    (gen-temp-defs estate env)
+		    (string-drop 2
+				 (string-map
+				  (lambda (e)
+				    (string-append
+				     (if use-stmt-expr? "; " ", ")
+				     ;; Strip off gratuitous ";\n" at end of expressions that
+				     ;; misguessed themselves to be in statement context.
+				     ;; See s-c-call, s-c-call-raw above.
+				     (let ((substmt (rtl-c-with-estate estate DFLT e)))
+				       (if (and (not use-stmt-expr?)
+						(string=? (string-take -2 substmt) ";\n"))
+					   (string-drop -2 substmt)
+					   substmt))))
+				  exprs))
+		    (if use-stmt-expr? "; })" ")"))))))
 )
 
 ; Return a <c-expr> node for a `do-count'.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-11-21 17:42 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-21 17:42 [commit] gcc's statement expressions for sequences Doug Evans

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).