[InstCombine] Sink sub into hands of select if one hand becomes zero (PR44426)
authorRoman Lebedev <lebedev.ri@gmail.com>
Sat, 4 Jan 2020 13:31:18 +0000 (16:31 +0300)
committerRoman Lebedev <lebedev.ri@gmail.com>
Sat, 4 Jan 2020 14:30:51 +0000 (17:30 +0300)
commit4d8e47ca180557e9bb872da0b8a6ad0fc515c4d3
tree86641891351593d9410c876031ab79265b63ab91
parent83aa0b6734da6760890012fc0ea08698741541a5
[InstCombine] Sink sub into hands of select if one hand becomes zero (PR44426)

This decreases use count of %Op1, makes one hand of select to be 0,
and possibly exposes further folding potential.

Name: sub (select %Cond, %Op1, %FalseVal), %Op1 -> select %Cond, 0, (sub %FalseVal, %Op1)
  %Op1 = %TrueVal
  %o = select i1 %Cond, i8 %Op1, i8 %FalseVal
  %r = sub i8 %o, %Op1
=>
  %n = sub i8 %FalseVal, %Op1
  %r = select i1 %Cond, i8 0, i8 %n

Name: sub (select %Cond, %TrueVal, %Op1), %Op1 -> select %Cond, (sub %TrueVal, %Op1), 0
  %Op1 = %FalseVal
  %o = select i1 %Cond, i8 %TrueVal, i8 %Op1
  %r = sub i8 %o, %Op1
=>
  %n = sub i8 %TrueVal, %Op1
  %r = select i1 %Cond, i8 %n, i8 0

https://rise4fun.com/Alive/avL

https://bugs.llvm.org/show_bug.cgi?id=44426
llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
llvm/test/Transforms/InstCombine/sub-minmax.ll
llvm/test/Transforms/InstCombine/subtract-of-one-hand-of-select.ll