From owner-freebsd-hackers@FreeBSD.ORG Sat Nov 19 10:23:48 2011 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 93581106566B for ; Sat, 19 Nov 2011 10:23:48 +0000 (UTC) (envelope-from gleb.kurtsou@gmail.com) Received: from mail-bw0-f54.google.com (mail-bw0-f54.google.com [209.85.214.54]) by mx1.freebsd.org (Postfix) with ESMTP id 25BFA8FC08 for ; Sat, 19 Nov 2011 10:23:47 +0000 (UTC) Received: by bkbzs8 with SMTP id zs8so5980442bkb.13 for ; Sat, 19 Nov 2011 02:23:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=2aANlYcmb9mFMjVZgQWr2r0Bi3ixzDVc5GWkIh3oFqM=; b=VTvQ7jF5IB/kqjDusvyprEsR6p9aLovGtMwvmDagDY6koq8YL23o+GPQwkUcbFqPxK s5bOZIerwyhIdNerUqaHtv/RjZ+UKIu8y9dBVyU9rFxGh65S/ZJn2vtYoa3mpyxZAkhb NiOGth3hLk4pTvJxGdV+OowVmMswMo8SrlkY0= Received: by 10.204.41.66 with SMTP id n2mr6875197bke.77.1321696910834; Sat, 19 Nov 2011 02:01:50 -0800 (PST) Received: from localhost ([78.157.92.5]) by mx.google.com with ESMTPS id c4sm2659701bkk.13.2011.11.19.02.01.49 (version=SSLv3 cipher=OTHER); Sat, 19 Nov 2011 02:01:49 -0800 (PST) Date: Sat, 19 Nov 2011 12:01:50 +0200 From: Gleb Kurtsou To: freebsd-hackers@FreeBSD.org Message-ID: <20111119100150.GA1560@reks> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Cc: mdf@freebsd.org Subject: gcc 4.2 miscompilation with -O2 -fno-omit-frame-pointer on amd64 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Nov 2011 10:23:48 -0000 Hi, I was lucky to write a bit of code which gcc 4.2 fails to compile correctly with -O2. Too keep long story short the code fails for gcc from base system and last gcc 4.2 snapshot from ports. It works with gcc 4.3, gcc 4.4 on FreeBSD and Linux. Clang from base is also good. -O and -Os optimization levels are fine (I've tried with all -f* flags mentioned in documentation) -O2 -fno-omit-frame-pointer combination is troublesome on amd64. I presume i386 should be fine. These options are also used for compilation of kernel (with debugging enabled) and modules. I'm not able to share the code, but have a test case reproducing the bug. I've encountered the issue over a week ago and tried narrowing it down to a simple test I could share but without much success. The code itself is very common: initialize two structs on stack, call a function with pointers to those stucts as arguments. A number of inlined assertion functions. gcc fails to correctly optimize struct assignments with -fno-omit-frame-pointer, I have a number of small structs assigned, gcc decides not to use data coping but to assign fields directly. I've tried disabling sra, tweaking sra parameters -- no luck in forcing it to copy data. Replacing one particular assignment with memcpy produces correct code, but that's not a solution. -O2 -fno-omit-frame-pointer -fno-inline is buggy -O2 -fno-omit-frame-pointer -frename-registers is buggy I found similar issue with gcc 4.6, but I'm not able to reproduce it with gcc test case: https://bugzilla.redhat.com/show_bug.cgi?id=679924 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47893 I'll be glad to help debugging it and will be hanging on #bsddev during weekend as glk. Thanks, Gleb.