[PATCH] D64713: [InstCombine] X *fast (C ? 1.0 : 0.0) -> C ? X : 0.0

Dávid Bolvanský via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 11 15:50:35 PST 2019


xbolva00 added a comment.

In D64713#1604491 <https://reviews.llvm.org/D64713#1604491>, @lebedev.ri wrote:

> In D64713#1604369 <https://reviews.llvm.org/D64713#1604369>, @xbolva00 wrote:
>
> > Do we miss int version of this? @spatel @lebedev.ri
> >
> >   int foo(int x, int y, bool b) {
> >       return x / (b  ? 1 : y);
> >   }
> >
> >
> > We have sdiv x, (select b 1 y), x86-64:
> >  cmov...
> >  idiv...
>
>
> I'd agree that having `select %b (div %x, %y), %x` would be better but that does not look like a valid transform:
>  https://godbolt.org/z/4Fs_dB
>  https://rise4fun.com/Alive/xplW
>
>   Optimization: D64713-int
>  
>   ERROR: Domain of definedness of Target is smaller than Source's for i32 %r
>  
>   Example:
>   %b i1 = 0x1 (1, -1)
>   %y i32 = poison
>   %x i32 = poison
>   %cond i32 = 0x00000001 (1)
>   %t0 i32 = UB
>   Source value: poison
>   Target value: UB
>
>
>   $ /repositories/alive2/build-Clang-unknown/alive -root-only /tmp/test.ll 
>   Processing /tmp/test.ll..
>  
>   ----------------------------------------
>   Name: D64713-int
>     %cond = select i1 %b, i8 1, i8 %y
>     %r = sdiv i8 %x, %cond
>     ret i8 %r
>   =>
>     %cond = select i1 %b, i8 1, i8 %y
>     %t0 = sdiv i8 %x, %y
>     %r = select i1 %b, i8 %x, i8 %t0
>     ret i8 %r
>  
>   ERROR: Source is more defined than target
>  
>   Example:
>   i1 %b = #x1 (1)
>   i8 %y = poison
>   i8 %x = poison
>  
>   Source:
>   i8 %cond = #x01 (1)
>   i8 %r = poison
>  
>   Target:
>   i8 %cond = #x01 (1)
>   i8 %t0 = poison
>   i8 %r = poison
>  
>


Can this be solved using freeze?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D64713/new/

https://reviews.llvm.org/D64713





More information about the llvm-commits mailing list