On Thu, Feb 9, 2012 at 3:41 PM, Richard Guenther <richard.guent...@gmail.com> wrote: > On Thu, Feb 9, 2012 at 2:48 PM, Kai Tietz <ktiet...@googlemail.com> wrote: >> 2012/2/9 Richard Guenther <richard.guent...@gmail.com>: >>> On Thu, Feb 9, 2012 at 11:53 AM, Richard Guenther >>> <richard.guent...@gmail.com> wrote: >>>> On Thu, Feb 9, 2012 at 11:29 AM, Richard Guenther >>>> <richard.guent...@gmail.com> wrote: >>>>> On Wed, Feb 8, 2012 at 10:25 PM, Kai Tietz <ktiet...@googlemail.com> >>>>> wrote: >>>>>> 2012/1/11 Richard Guenther <richard.guent...@gmail.com>: >>>>>>> >>>>>>> count despite being declared volatile and only loaded once in the source >>>>>>> is loaded twice in gimple. If it were a HW register which destroys the >>>>>>> device after the 2nd load without an intervening store you'd wrecked >>>>>>> the device ;) >>>>>>> >>>>>>> Richard. >>>>>> >>>>>> Thanks for explaination. I tried to flip order for lhs/rhs in >>>>>> gimplify_modify_expr & co. Issue here is that for some cases we are >>>>>> relying here on lhs for gimplifying rhs (is_gimple_reg_rhs_or_call vs >>>>>> is_gimple_mem_rhs_or_call) and this doesn't work for cases in C++ >>>>>> like: >>>>>> >>>>>> typedef const unsigned char _Jv_Utf8Const; >>>>>> typedef __SIZE_TYPE__ uaddr; >>>>>> >>>>>> void maybe_adjust_signature (_Jv_Utf8Const *&s, uaddr &special) >>>>>> { >>>>>> union { >>>>>> _Jv_Utf8Const *signature; >>>>>> uaddr signature_bits; >>>>>> }; >>>>>> signature = s; >>>>>> special = signature_bits & 1; >>>>>> signature_bits -= special; >>>>>> s = signature; >>>>>> } >>>>>> >>>>>> So I modified gimplify_self_mod_expr for post-inc/dec so that we use >>>>>> following sequence >>>>>> and add it to pre_p for it: >>>>>> >>>>>> tmp = lhs; >>>>>> lvalue = tmp (+/-) rhs >>>>>> *expr_p = tmp; >>>>> >>>>> As I explained this is the wrong place to fix the PR. The issue is not >>>>> about self-modifying expressions but about evaluating call argument >>>>> side-effects before side-effects of the lhs. >>>> >>>> I am testing the attached instead. >>> >>> Doesn't work. Btw, Kai, your patch surely breaks things if you put >>> the lvalue update into the pre queue. >>> >>> Consider a simple >>> >>> a[i++] = i; >>> >>> you gimplify that to >>> >>> i.0 = i; >>> D.1709 = i.0; >>> i = D.1709 + 1; >>> a[D.1709] = i; >>> >>> which is wrong. >>> >>> Seems we are lacking some basic pre-/post-modify testcases ... >>> >>> Richard. >> >> Why, this should be wrong? In fact C specification just says that the >> post-inc has to happen at least before next sequence-point. It >> doesn't say that the increment has to happen after evaluation of rhs. >> >> The produced gimple for the following C-code >> >> int arr[128]; >> >> void foo (int i) >> { >> arr[i++] = i; >> } >> >> is: >> >> foo (int i) >> { >> int D.1364; >> >> D.1364 = i; >> i = D.1364 + 1; >> arr[D.1364] = i; >> } >> >> which looks to me from description of the C-specification correct. > > Hm, indeed. I'll test the following shorter patch and add the struct-return > volatile testcase.
Works apart from Running target unix/ FAIL: ext/pb_ds/regression/trie_map_rand.cc execution test FAIL: ext/pb_ds/regression/trie_set_rand.cc execution test Maybe invalid testcases. Who knows ... same fails happen with your patch. Richard. > Richard.