This is the mail archive of the
cgen@sourceware.org
mailing list for the CGEN project.
[commit] gcc's statement expressions for sequences
- From: Doug Evans <dje at sebabeach dot org>
- To: cgen at sourceware dot org
- Date: Sat, 21 Nov 2009 09:41:00 -0800 (PST)
- Subject: [commit] gcc's statement expressions for sequences
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'.