[PATCH] D144760: [InstCombine] use demanded vector elements to eliminate partially redundant instructions

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 27 11:56:38 PST 2023


spatel marked an inline comment as done.
spatel added inline comments.


================
Comment at: llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp:1715
   BinaryOperator *BO;
   if (match(I, m_BinOp(BO)) && !BO->isIntDivRem() && !BO->isShift()) {
+    Value *X = BO->getOperand(0);
----------------
goldstein.w.n wrote:
> Why doesn't this work for div/rem/shift?
**This** patch should be fine with any binop since we're not altering any instructions, but I left it inside this block as a first step to try to be safer. I can put a TODO comment on it.

The existing code is definitely not safe for div/rem because it can do this:
  %u = udiv <2 x i32> %x, <i32 42, i32 1>
  %s = shufflevector <2 x i32> %u, <2 x i32> poison, <2 x i32> zeroinitializer
  -->
  %u = udiv <2 x i32> %x, <i32 42, i32 poison>  ; we don't demand element 1, so replace constant 1
  %s = shufflevector <2 x i32> %u, <2 x i32> poison, <2 x i32> zeroinitializer

...but now we have a divide-by-poison element which can be replaced by a divide-by-0 element which means the whole instruction is UB/poison, and that's wrong of course.

I need to look through the old patches to see if there's still potential to do bad things with shifts.


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

https://reviews.llvm.org/D144760



More information about the llvm-commits mailing list