From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13729 invoked by alias); 28 May 2012 09:40:19 -0000 Received: (qmail 13720 invoked by uid 22791); 28 May 2012 09:40:19 -0000 X-SWARE-Spam-Status: No, hits=-3.5 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from localhost (HELO gcc.gnu.org) (127.0.0.1) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 28 May 2012 09:40:06 +0000 From: "etienne_lorrain at yahoo dot fr" To: gcc-bugs@gcc.gnu.org Subject: [Bug rtl-optimization/53507] New: ia32/amd64: bsf can be used to test null memory, bsf sets zero flag Date: Mon, 28 May 2012 10:03:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: rtl-optimization X-Bugzilla-Keywords: X-Bugzilla-Severity: enhancement X-Bugzilla-Who: etienne_lorrain at yahoo dot fr X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Changed-Fields: Message-ID: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 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: 2012-05/txt/msg02628.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53507 Bug #: 53507 Summary: ia32/amd64: bsf can be used to test null memory, bsf sets zero flag Classification: Unclassified Product: gcc Version: 4.6.3 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: rtl-optimization AssignedTo: unassigned@gcc.gnu.org ReportedBy: etienne_lorrain@yahoo.fr Compiling: int I; void ifnull(void); void testnull(void) { if (I == 0) ifnull(); } void fct (unsigned u) { if (u != 0) I = __builtin_ffs(u) - 1; } result in for testnull(): movl I, %eax testl %eax, %eax je .L4 rep ret .L4: jmp ifnull() It would be shorter/quicker to replace the two first lines by: bsfl I, %eax je ifnull() i.e. there is no need to load the memory variable into a register with bsf/bsr. And result for fct(): movl 4(%esp), %eax testl %eax, %eax je .L5 bsfl %eax, %eax movl %eax, I .L5: rep ret It would be shorter/quicker to test if the parameter u is null by the bsf instruction: bsfl 4(%esp), %eax cmovne %eax, I .L5: rep ret