* [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).