From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5037 invoked by alias); 21 Nov 2009 17:42:16 -0000 Received: (qmail 5018 invoked by uid 22791); 21 Nov 2009 17:42:15 -0000 X-SWARE-Spam-Status: No, hits=-0.5 required=5.0 tests=AWL,BAYES_00,DNS_FROM_RFC_BOGUSMX X-Spam-Check-By: sourceware.org Received: from sebabeach.org (HELO sebabeach.org) (64.165.110.50) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 21 Nov 2009 17:41:02 +0000 Received: by sebabeach.org (Postfix, from userid 500) id 8F97A6E3D9; Sat, 21 Nov 2009 09:41:00 -0800 (PST) From: Doug Evans To: cgen@sourceware.org Subject: [commit] gcc's statement expressions for sequences Message-Id: <20091121174100.8F97A6E3D9@sebabeach.org> Date: Sat, 21 Nov 2009 17:42:00 -0000 X-IsSubscribed: yes Mailing-List: contact cgen-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cgen-owner@sourceware.org X-SW-Source: 2009-q4/txt/msg00039.txt.bz2 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 * 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 node for a `sequence'. -; MODE is the mode name. +;; Return a 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 node for a `do-count'.