GCC Bugzilla – Bug 23666
Fold does not reduce C - ~a into a + (C+1)
Last modified: 2007-07-01 00:51:27 UTC
The asm for the following two functions should be the same.
int f(int a)
return 10 - ~a;
int f1(int a)
return a + 11;
Found while reading LLVM's instruction combiner.
Works for me on alphaev68-unknown-linux-gnu
tiw with 4.1.0 20050819.
(In reply to comment #1)
> Works for me on alphaev68-unknown-linux-gnu
> tiw with 4.1.0 20050819.
And does not with 4.1.0 20050901 on i686-pc-linux-gnu or on powerpc-darwin.
The problem here is my fault, slightly. Fold is converting -(~a) in the NEGATE_EXPR but not in the generic functions to do the negation. I will do the patch for this one. (I am saying that -(~a) is more complex than a+1 which is true).
Actually there is two things that need to be done, first is what I said in comment # 4 and then the second thing is for MINUS_EXPR to use those functions instead of checking explicatly for NEGATE_EXPR.
Actually it is just a check for flag_wrapv which looks to be wrong as far as I can tell.
After the patch which I am about to test, we get this with -fwrapv (yes that is weird we get it with something which should be cause optimizations not to happen and not the other way around).
I am not going to fix this now as it exposes too many VRP issues and other issues.
This is exactly the same issue as PR 23295 now (I should copy some of the comments from here to there).
With the patch for 23295 we get the behavior as noted in comment #7. This is due
to negate_expr_p (correctly) containing
return INTEGRAL_TYPE_P (type)
&& (TYPE_UNSIGNED (type)
|| (flag_wrapv && !flag_trapv));
as negating ~7ffffff will result in signed overflow which is undefined without flag_wrapv.