From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28026 invoked by alias); 7 Aug 2009 07:38:04 -0000 Received: (qmail 27932 invoked by uid 48); 7 Aug 2009 07:37:53 -0000 Date: Fri, 07 Aug 2009 07:38:00 -0000 Message-ID: <20090807073753.27931.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug c/40987] Wrong optimization with if-conversion In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "thomas at coware dot com" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2009-08/txt/msg00689.txt.bz2 ------- Comment #7 from thomas at coware dot com 2009-08-07 07:37 ------- This is how function func looks after the if conversion (test.c.144r.ce1): (note 4 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK) (insn 2 4 3 2 test.c:3 (set (reg/v:SI 63 [ arg ]) (mem/c/i:SI (reg/f:SI 16 argp) [0 arg+0 S4 A32])) 41 {*movsi_1} (expr_list:REG_EQUIV (mem/c/i:SI (reg/f:SI 16 argp) [0 arg+0 S4 A32]) (nil))) (note 3 2 7 2 NOTE_INSN_FUNCTION_BEG) (insn 7 3 34 2 test.c:5 (set (reg:CCGOC 17 flags) (compare:CCGOC (reg/v:SI 63 [ arg ]) (const_int 0 [0x0]))) 0 {*cmpsi_ccno_1} (nil)) (insn 34 7 35 2 test.c:5 (parallel [ (set (reg:DI 65) (sign_extend:DI (reg/v:SI 63 [ arg ]))) (clobber (reg:CC 17 flags)) (clobber (scratch:SI)) ]) 87 {*extendsidi2_1} (nil)) (insn 35 34 36 2 test.c:5 (parallel [ (set (reg/v:DI 60 [ val ]) (lshiftrt:DI (reg:DI 65) (const_int 63 [0x3f]))) (clobber (reg:CC 17 flags)) ]) 356 {*lshrdi3_1} (nil)) (insn 36 35 24 2 test.c:5 (parallel [ (set (reg/v:DI 60 [ val ]) (ashift:DI (reg/v:DI 60 [ val ]) (const_int 31 [0x1f]))) (clobber (reg:CC 17 flags)) ]) 319 {*ashldi3_1} (nil)) (insn 24 36 30 2 test.c:9 (set (reg/i:DI 0 ax) (reg/v:DI 60 [ val ])) 63 {*movdi_2} (nil)) (insn 30 24 0 2 test.c:9 (use (reg/i:DI 0 ax)) -1 (nil)) This already looks wrong to me, but I am not completely sure. Could somebody have a look who understands this RTL code better than me? The last version before the if conversion looks like this (test.c.141r.cse1): (note 4 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK) (insn 2 4 3 2 test.c:3 (set (reg/v:SI 63 [ arg ]) (mem/c/i:SI (reg/f:SI 16 argp) [0 arg+0 S4 A32])) 41 {*movsi_1} (expr_list:REG_EQUIV (mem/c/i:SI (reg/f:SI 16 argp) [0 arg+0 S4 A32]) (nil))) (note 3 2 7 2 NOTE_INSN_FUNCTION_BEG) (insn 7 3 8 2 test.c:5 (set (reg:CCGOC 17 flags) (compare:CCGOC (reg/v:SI 63 [ arg ]) (const_int 0 [0x0]))) 0 {*cmpsi_ccno_1} (nil)) (jump_insn 8 7 9 2 test.c:5 (set (pc) (if_then_else (lt (reg:CCGOC 17 flags) (const_int 0 [0x0])) (label_ref 13) (pc))) 401 {*jcc_1} (nil)) (note 9 8 10 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 10 9 13 3 test.c:5 (set (reg/v:DI 60 [ val ]) (const_int 0 [0x0])) 63 {*movdi_2} (nil)) (code_label 13 10 14 4 2 "" [1 uses]) (note 14 13 16 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (insn 16 14 17 4 test.c:6 (set (reg/v:DI 60 [ val ]) (const_int -2147483648 [0x80000000])) 63 {*movdi_2} (nil)) (code_label 17 16 18 5 3 "" [0 uses]) (note 18 17 20 5 [bb 5] NOTE_INSN_BASIC_BLOCK) (insn 20 18 24 5 test.c:8 (set (reg:DI 62 [ ]) (reg/v:DI 60 [ val ])) 63 {*movdi_2} (nil)) (insn 24 20 30 5 test.c:9 (set (reg/i:DI 0 ax) (reg/v:DI 60 [ val ])) 63 {*movdi_2} (nil)) (insn 30 24 0 5 test.c:9 (use (reg/i:DI 0 ax)) -1 (nil)) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40987