<div dir="ltr"><div class="gmail_default">Ping</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 11, 2016 at 4:08 PM, Guozhi Wei <span dir="ltr"><<a href="mailto:carrot@google.com" target="_blank">carrot@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Carrot created this revision.<br>
Carrot added a reviewer: hfinkel.<br>
Carrot added a subscriber: llvm-commits.<br>
Herald added a subscriber: nemanjai.<br>
<br>
This patch fixes pr25548.<br>
<br>
Current implementation of PPCBoolRetToInt doesn't handle CallInst correctly, so it failed to do the intended optimization when there is a CallInst with parameters. This patch fixed that.<br>
<br>
<a href="http://reviews.llvm.org/D22243" rel="noreferrer" target="_blank">http://reviews.llvm.org/D22243</a><br>
<br>
Files:<br>
  lib/Target/PowerPC/PPCBoolRetToInt.cpp<br>
  test/CodeGen/PowerPC/BoolRetToIntTest.ll<br>
<br>
Index: test/CodeGen/PowerPC/BoolRetToIntTest.ll<br>
===================================================================<br>
--- test/CodeGen/PowerPC/BoolRetToIntTest.ll<br>
+++ test/CodeGen/PowerPC/BoolRetToIntTest.ll<br>
@@ -198,6 +198,8 @@<br>
 define zeroext i1 @call_test() {<br>
 ; CHECK: [[REG:%.+]] = call i1<br>
   %result = call i1 @return_i1()<br>
+; CHECK: [[REG:%.+]] = zext i1 {{%.+}} to i32<br>
+; CHECK: [[REG:%.+]] = trunc i32 {{%.+}} to i1<br>
 ; CHECK: ret i1 [[REG]]<br>
   ret i1 %result<br>
-}<br>
\ No newline at end of file<br>
+}<br>
Index: lib/Target/PowerPC/PPCBoolRetToInt.cpp<br>
===================================================================<br>
--- lib/Target/PowerPC/PPCBoolRetToInt.cpp<br>
+++ lib/Target/PowerPC/PPCBoolRetToInt.cpp<br>
@@ -66,7 +66,8 @@<br>
     while (!WorkList.empty()) {<br>
       Value *Curr = WorkList.back();<br>
       WorkList.pop_back();<br>
-      if (User *CurrUser = dyn_cast<User>(Curr))<br>
+      User *CurrUser = dyn_cast<User>(Curr);<br>
+      if (CurrUser && !isa<CallInst>(Curr))<br>
         for (auto &Op : CurrUser->operands())<br>
           if (Defs.insert(Op).second)<br>
             WorkList.push_back(Op);<br>
@@ -199,11 +200,12 @@<br>
     if (!std::any_of(Defs.begin(), Defs.end(), isa<Instruction, Value *>))<br>
       return false;<br>
<br>
-    // Presently, we only know how to handle PHINode, Constant, and Arguments.<br>
-    // Potentially, bitwise operations (AND, OR, XOR, NOT) and sign extension<br>
-    // could also be handled in the future.<br>
+    // Presently, we only know how to handle PHINode, Constant, Arguments and<br>
+    // CallInst. Potentially, bitwise operations (AND, OR, XOR, NOT) and sign<br>
+    // extension could also be handled in the future.<br>
     for (Value *V : Defs)<br>
-      if (!isa<PHINode>(V) && !isa<Constant>(V) && !isa<Argument>(V))<br>
+      if (!isa<PHINode>(V) && !isa<Constant>(V) &&<br>
+          !isa<Argument>(V) && !isa<CallInst>(V))<br>
         return false;<br>
<br>
     for (Value *V : Defs)<br>
@@ -227,7 +229,7 @@<br>
       User *First = dyn_cast<User>(Pair.first);<br>
       User *Second = dyn_cast<User>(Pair.second);<br>
       assert((!First || Second) && "translated from user to non-user!?");<br>
-      if (First)<br>
+      if (First && !isa<CallInst>(First))<br>
         for (unsigned i = 0; i < First->getNumOperands(); ++i)<br>
           Second->setOperand(i, BoolToIntMap[First->getOperand(i)]);<br>
     }<br>
<br>
<br>
</blockquote></div><br></div>