[InstCombine] only allow narrow/wide evaluation of values with >1 use if that user...
authorSanjay Patel <spatel@rotateright.com>
Mon, 5 Feb 2018 17:16:50 +0000 (17:16 +0000)
committerSanjay Patel <spatel@rotateright.com>
Mon, 5 Feb 2018 17:16:50 +0000 (17:16 +0000)
There was a logic hole in D42739 / rL324014 because we're not accounting for select and phi
instructions that might have repeated operands. This is likely a source of an infinite loop.
I haven't manufactured a test case to prove that, but it should be safe to speculatively limit
this transform to binops while we try to create that test.

llvm-svn: 324252

llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp

index 18cd000..9046c36 100644 (file)
@@ -327,12 +327,14 @@ static bool canNotEvaluateInType(Value *V, Type *Ty) {
   if (!isa<Instruction>(V))
     return true;
   // We can't extend or shrink something that has multiple uses -- unless those
-  // multiple uses are all in the same instruction -- doing so would require
-  // duplicating the instruction which isn't profitable.
-  if (!V->hasOneUse())
+  // multiple uses are all in the same binop instruction -- doing so would
+  // require duplicating the instruction which isn't profitable.
+  if (!V->hasOneUse()) {
+    if (!match(V->user_back(), m_BinOp()))
+      return true;
     if (any_of(V->users(), [&](User *U) { return U != V->user_back(); }))
       return true;
-
+  }
   return false;
 }