[PATCH] D23824: [ADCE] Add handling of PHI nodes when removing control flow

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 6 15:49:45 PDT 2016


In particular, this should do it:

int foo (int b, int j)
{
  if (b)
    {
      int i;
      for (i = 0; i<1000; ++i)
        ;
      j = 0;
    }
  return j;
}


On Tue, Sep 6, 2016 at 3:41 PM, Daniel Berlin <dberlin at dberlin.org> wrote:

> Yes, that is why i said you may need to make the phi non-constant (ie make
> a new parameter):
>
> It is propagating the constant into the phi:
>     %j.0 = phi i32 [ 0, %0 ], [ 1, %2 ]
>
> Thus, you never end up marking anything interesting live there.
>
>
>
>
>
> On Tue, Sep 6, 2016 at 3:30 PM, David Callahan <dcallahan at fb.com> wrote:
>
>> david2050 added a comment.
>>
>> I ran this test:
>>
>>   int foo(int a, int b, int N) {
>>     int j = 0;
>>     if (b) {
>>       int i;
>>       for (i = 0; i < N; i++)
>>         ;
>>       j = 1;
>>     }
>>     return j;
>>   }
>>
>> compiled to bc and then processed:  opt -sroa -adce -adce-remove-loops
>> and it did successfully remove the loop.  I also tried this variant
>>
>>   int foo(int b, int N) {
>>     int j = 0;
>>     if (b) {
>>       int i;
>>       j = 1;
>>       for (i = 0; i < N; i++)
>>         ;
>>     }
>>     return j;
>>   }
>>
>> The final output for that one looked like:
>>
>>   define i32 @foo(i32 %b, i32 %N) #0 {
>>     %1 = icmp ne i32 %b, 0
>>     br i1 %1, label %2, label %3
>>
>>   ; <label>:2:                                      ; preds = %0
>>     br label %3
>>
>>   ; <label>:3:                                      ; preds = %2, %0
>>     %j.0 = phi i32 [ 0, %0 ], [ 1, %2 ]
>>     ret i32 %j.0
>>   }
>>
>>
>> https://reviews.llvm.org/D23824
>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160906/6d1f9f48/attachment.html>


More information about the llvm-commits mailing list