[llvm] [InstCombine] Extend `foldICmpAddConstant` to disjoint `or`. (PR #75899)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 29 04:16:37 PST 2023


dtcxzyw wrote:

> > > @mgudim Could you please have a look at [dtcxzyw/llvm-opt-benchmark#10](https://github.com/dtcxzyw/llvm-opt-benchmark/pull/10)? Our CI found that this patch introduced some unnecessary `and %size, ~signmask` patterns before calling `operator new(size_t)`. Some file changes:
> > 
> > 
> > @dtcxzyw Sure, I'll take a look. But I didn't understand what file exactly the regressions are at. Can you paste the IR before and after the transformation. Preferably the smallest function which shows the regression.
> 
> One example:
> 
> ```
> diff --git a/bench/proxygen/optimized/HTTP2PriorityQueue.cpp.ll b/bench/proxygen/optimized/HTTP2PriorityQueue.cpp.ll
> index 54ccb32b..9d7fe815 100644
> --- a/bench/proxygen/optimized/HTTP2PriorityQueue.cpp.ll
> +++ b/bench/proxygen/optimized/HTTP2PriorityQueue.cpp.ll
> @@ -7152,7 +7152,7 @@ entry:
>    %mul3.i31 = shl i64 %newChunkCount, 8
>    %retval.0.i32 = select i1 %cmp.i28, i64 %add.i30, i64 %mul3.i31
>    store i64 %retval.0.i32, ptr %newAllocSize, align 8
> -  %cmp.i.i.i.i.i = icmp slt i64 %retval.0.i32, 0
> +  %cmp.i.i.i.i.i = icmp slt i64 %retval.0.i32, -15
>    br i1 %cmp.i.i.i.i.i, label %if.then.i.i.i.i.i, label %_ZN5folly3f146detail10BasePolicyImPN8proxygen18HTTP2PriorityQueue4NodeEvvvSt4pairIKmS6_EE12beforeRehashEmmmmRPh.exit
>  
>  if.then.i.i.i.i.i:                                ; preds = %entry
> @@ -7160,7 +7160,8 @@ if.then.i.i.i.i.i:                                ; preds = %entry
>    unreachable
>  
>  _ZN5folly3f146detail10BasePolicyImPN8proxygen18HTTP2PriorityQueue4NodeEvvvSt4pairIKmS6_EE12beforeRehashEmmmmRPh.exit: ; preds = %entry
> -  %call5.i.i2.i.i1.i = tail call noalias noundef nonnull ptr @_Znwm(i64 noundef %retval.0.i32) #30
> +  %div1.i.i.i = and i64 %retval.0.i32, 9223372036854775792
> +  %call5.i.i2.i.i1.i = tail call noalias noundef nonnull ptr @_Znwm(i64 noundef %div1.i.i.i) #30
>    store ptr %call5.i.i2.i.i1.i, ptr %rawAllocation, align 8
>    store i8 0, ptr %undoState, align 1
>    %cmp5.not.i = icmp ne i64 %newChunkCount, 0
> ```
> 
> I will post a reduced test case later :)

Sorry, I cannot provide a reduced test since it is hard to do semantic-preserving reduction.
It seems that we lose the information `%retval.0.i32 >= 0`.


https://github.com/llvm/llvm-project/pull/75899


More information about the llvm-commits mailing list