[llvm-dev] sinking in LICM

via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 10 12:23:46 PDT 2017


On 2017-08-10 14:42, Quentin Colombet wrote:
> Hi,
> 
> That sounds like a job for the SinkingPass. Doesn’t it catch this case?


Just ran SinkPass for the example IR. SinkPass sink only %tmp.8 from 
%Loop to %ContLoop which is the last suitable place for sinking 
dominating its use in %Out12. From the original IR I mentioned, we may 
want to sink an instruction from the loop body to exit blocks. For me, 
this seem to be a case we need to handle in LICM.


> 
> Cheers,
> -Quentin
>> On Aug 10, 2017, at 11:34 AM, via llvm-dev <llvm-dev at lists.llvm.org> 
>> wrote:
>> 
>> Hi,
>> 
>> In the IR below, %tmp.7 and %tmp.8 are not used in loop, so we can 
>> sink them in exit blocks. However, LICM do not handle this case 
>> because of the check in isNotUsedInLoop() which returns false when a 
>> PHI node use is hooked from a block inside the loop. I'm not sure if 
>> we really need to have this check even when the PHI is outside the 
>> loop?
>> 
>> define i32 @test7(i32 %N, i32 %N2, i1 %C) {
>> Entry:
>>        br label %Loop
>> Loop:
>>        %N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ]
>>        %tmp.6 = mul i32 %N, %N_addr.0.pn
>>        %tmp.7 = sub i32 %tmp.6, %N
>>        %tmp.8 = sub i32 %tmp.6, %N2
>>        %dec = add i32 %N_addr.0.pn, -1
>>        br i1 %C, label %ContLoop, label %Out12
>> 
>> ContLoop:
>>        %tmp.1 = icmp ne i32 %N_addr.0.pn, 1
>>        br i1 %tmp.1, label %Loop, label %Out12
>> 
>> Out12:
>>  %tmp.7.8.lcssa1 = phi i32 [%tmp.8, %ContLoop], [%tmp.7, %Loop]
>>  ret i32 %tmp.7.8.lcssa1
>> }
>> 
>> Is there any problem I'm missing if we convert the above IR to the IR 
>> below :
>> 
>> define i32 @test7(i32 %N, i32 %N2, i1 %C) {
>> Entry:
>>  br label %Loop
>> 
>> Loop:
>>  %N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ]
>>  %dec = add i32 %N_addr.0.pn, -1
>>  br i1 %C, label %ContLoop, label %Out01
>> 
>> ContLoop:
>>  %tmp.1 = icmp ne i32 %N_addr.0.pn, 1
>>  br i1 %tmp.1, label %Loop, label %Out02
>> 
>> Out01:
>>  %N_addr.0.pn.lcssa2 = phi i32 [ %N_addr.0.pn, %Loop ]
>>  %tmp.6.le1 = mul i32 %N, %N_addr.0.pn.lcssa2
>>  %tmp.8.new = sub i32 %tmp.6.le1, %N2
>>  br label %Out12
>> 
>> Out02:
>>  %N_addr.0.pn.lcssa = phi i32 [ %N_addr.0.pn, %ContLoop ]
>>  %tmp.6.le = mul i32 %N, %N_addr.0.pn.lcssa
>>  %tmp.7.new = sub i32 %tmp.6.le, %N
>>  br label %Out12
>> 
>> Out12:
>>  %tmp.7.8.ret = phi i32 [ %tmp.8.new, %Out01 ], [ %tmp.7.new, %Out02 ]
>>  ret i32 %tmp.7.8.ret
>> }
>> 
>> Thanks,
>> Jun
>> 
>> 
>> --
>> Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm 
>> Technologies, Inc.
>> Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a 
>> Linux Foundation Collaborative Project.
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-- 
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm 
Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a 
Linux Foundation Collaborative Project.


More information about the llvm-dev mailing list