[llvm-commits] [PATCH][SOPT] Fix assertion in Reassociate
Evan Cheng
evan.cheng at apple.com
Thu Nov 15 10:51:07 PST 2012
On Nov 15, 2012, at 10:41 AM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:
> Hi, Dancan:
>
> As I state in my mail sent to this list for review. I already stated there are two ways to move on:
> 1) to fix the "problem" of LinearizeExprTree -- the problem is that it does better job than it is expected.
> 2) choose right order of optimization.
>
> I don't like to touch 1) because it seems to be too complicate then the concept involved. As far as I can understand
> it just to decompose a big expression tree into N-ary form, like E1 + E2 ... + E2. This function can reused for other reassociates
> for different purpose: like reassociate for tree-height-reduction, reassociate to expose redundancy ( a + b + c => (a + c) + b,
> it there is a+c in the nearby code).
>
> I went for 2) because iterating the instructions in right order is important to the reassociate performance.
>
> 1) and 2) are *NOT* exclusive.
>
> 2) not only fix (you may think it is merely sidestep) the problem.
> It include the enhancement to the worklist, making it possible to go through the worklist in forward order.
> It also remove the cost the erasing element in the middle of the container.
> It also include the optimization for "t = -a; t2 = t * 7 (where t has multiple uses)" => t2 = a * -7"
>
> How about all this changes?
>
> Down the load, please let us know if you want to own the Reassociate.cpp and have *EXCLUSIVELY" write-permission or not.
There is no such thing as "exclusive" write permission in the LLVM community. I don't think this is ever suggested during the discussion.
Evan
>
> Thanks
> Shuxin
>
>
> On 11/15/12 2:04 AM, Duncan Sands wrote:
>> Hi Shuxin,
>>
>> On 06/11/12 20:43, Shuxin Yang wrote:
>>> Hi, Duncan:
>>>
>>> Thank you for looking into this problem.
>>>
>>> I don't know for sure if the testing case I'm working on is proprietary or
>>> not.
>>> I try to come up a contrived example, see bellow. This contrived example triggers
>>> exactly the same assertion, but the assertion is triggered at different stage.
>>> (See following
>>> code for the concept of stage).
>>
>> thanks for the testcase. I've fixed the issue in commit 168035. This is a
>> mismatch between what RemoveFactorFromExpression is expecting LinearizeExprTree
>> to do, and what LinearizeExprTree actually does (it does too much). As far as
>> I can see this is an accident waiting to happen, so better to make things more
>> robust rather than trying to dance carefully around it by changing the order in
>> which instructions are visited. I hope this fixes the real testcase too.
>>
>> Ciao, Duncan.
>>
>>>
>>> contrived example
>>> =============
>>> cat a.ll
>>> define i32 @foo(i32 %arg, i32 %arg1, i32 %arg2) nounwind {
>>> mylab:
>>> %tmp1 = mul i32 %arg1, 2
>>> %tmp2 = mul i32 %tmp1, 3
>>> %tmp3 = mul i32 %arg2, 2
>>> ; dead code
>>> %tmp4 = add i32 %tmp1, 1
>>> %ret = add i32 %tmp2, %tmp3
>>> ret i32 %ret
>>> }
>>>
>>> reproduced by "opt -S -reassociate a.ll
>>>
>>> Unfortunately, my patch does not catch this contrived example either, because
>>> it only tries to catch this situation
>>> in stage 2. see bellow:
>>>
>>> The "stages"
>>> =======================
>>> bool Reassociate::runOnFunction() {
>>> for each basic block bb {
>>> // stage 1: go through all instruction in given bb in forward order
>>> for each instruction i
>>> if i is dead
>>> erase i
>>> else
>>> reassociate i
>>>
>>> // stage 2:
>>> while (worklist != empty) {
>>> i = worklist.pop_back_val;
>>> opt or delete i;
>>> }
>>> }
>>>
>>> I guess we should not delete Instruction during the process of reassociation.
>>>
>>> Thanks
>>> Shuxin
>>>
>>>
>>> On 11/6/12 1:20 AM, Duncan Sands wrote:
>>>> Hi Shuxin,
>>>>
>>>>> The testing case (reduced by bugpoint) for this probelm is not inclued in the
>>>>> patch, as it
>>>>> is too big.
>>>>
>>>> can you please send it to the list so that people can analyse it, even if it
>>>> won't be part of the final patch.
>>>>
>>>> Thanks, Duncan.
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list