From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 95221 invoked by alias); 20 May 2015 11:20:15 -0000 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 Received: (qmail 88436 invoked by uid 48); 20 May 2015 11:20:05 -0000 From: "gil.hur at sf dot snu.ac.kr" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/65752] Too strong optimizations int -> pointer casts Date: Wed, 20 May 2015 11:20:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Version: 4.9.2 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: gil.hur at sf dot snu.ac.kr X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2015-05/txt/msg01620.txt.bz2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65752 --- Comment #27 from Chung-Kil Hur --- (In reply to Chung-Kil Hur from comment #26) > Thanks for the detailed explanations. > > > The C standard only guarantees that you can convert a pointer to uintptr_t > > and back, it doesn't guarantee that you can convert a modified uintptr_t > > back to > > a pointer that is valid. > > > > Thus, doing (int *)((xp + i) - j) is invoking undefined behavior. > > > > I didn't know about this rule. > I thought this cast is valid because "(xp+i)-j" is even "safely-derived". > > Could you give a reference for that rule in the standard? > > Thanks! It seems that the following rule might be the one. ================================= 7.20.1.4 Integer types capable of holding object pointers The following type designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer: intptr_t The following type designates an unsigned integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer: uintptr_t These types are optional. ================================= Right. This does not say that we are allowed to cast a modified integer back to a pointer. What I remember might be from the C++ standard, where "safely derived" integers are allowed to be cast back to pointers. Umm. This might also be implementation-defined. Anyway, thanks very much for taking your time to respond to my questions!! Best, Gil