[PATCH] D22243: [PPC] Handling CallInst in PPCBoolRetToInt

Guozhi Wei via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 2 16:00:38 PDT 2016


Carrot updated this revision to Diff 66580.
Carrot added a comment.

Add comments for CallInst handling.


https://reviews.llvm.org/D22243

Files:
  lib/Target/PowerPC/PPCBoolRetToInt.cpp
  test/CodeGen/PowerPC/BoolRetToIntTest.ll

Index: test/CodeGen/PowerPC/BoolRetToIntTest.ll
===================================================================
--- test/CodeGen/PowerPC/BoolRetToIntTest.ll
+++ test/CodeGen/PowerPC/BoolRetToIntTest.ll
@@ -198,6 +198,8 @@
 define zeroext i1 @call_test() {
 ; CHECK: [[REG:%.+]] = call i1
   %result = call i1 @return_i1()
+; CHECK: [[REG:%.+]] = zext i1 {{%.+}} to i32
+; CHECK: [[REG:%.+]] = trunc i32 {{%.+}} to i1
 ; CHECK: ret i1 [[REG]]
   ret i1 %result
-}
\ No newline at end of file
+}
Index: lib/Target/PowerPC/PPCBoolRetToInt.cpp
===================================================================
--- lib/Target/PowerPC/PPCBoolRetToInt.cpp
+++ lib/Target/PowerPC/PPCBoolRetToInt.cpp
@@ -66,7 +66,10 @@
     while (!WorkList.empty()) {
       Value *Curr = WorkList.back();
       WorkList.pop_back();
-      if (User *CurrUser = dyn_cast<User>(Curr))
+      User *CurrUser = dyn_cast<User>(Curr);
+      // Operands of CallInst are skipped because they may not be Bool type,
+      // and their positions are defined by ABI.
+      if (CurrUser && !isa<CallInst>(Curr))
         for (auto &Op : CurrUser->operands())
           if (Defs.insert(Op).second)
             WorkList.push_back(Op);
@@ -199,11 +202,12 @@
     if (!std::any_of(Defs.begin(), Defs.end(), isa<Instruction, Value *>))
       return false;
 
-    // Presently, we only know how to handle PHINode, Constant, and Arguments.
-    // Potentially, bitwise operations (AND, OR, XOR, NOT) and sign extension
-    // could also be handled in the future.
+    // Presently, we only know how to handle PHINode, Constant, Arguments and
+    // CallInst. Potentially, bitwise operations (AND, OR, XOR, NOT) and sign
+    // extension could also be handled in the future.
     for (Value *V : Defs)
-      if (!isa<PHINode>(V) && !isa<Constant>(V) && !isa<Argument>(V))
+      if (!isa<PHINode>(V) && !isa<Constant>(V) &&
+          !isa<Argument>(V) && !isa<CallInst>(V))
         return false;
 
     for (Value *V : Defs)
@@ -221,13 +225,15 @@
       if (!BoolToIntMap.count(V))
         BoolToIntMap[V] = translate(V);
 
-    // Replace the operands of the translated instructions. There were set to
+    // Replace the operands of the translated instructions. They were set to
     // zero in the translate function.
     for (auto &Pair : BoolToIntMap) {
       User *First = dyn_cast<User>(Pair.first);
       User *Second = dyn_cast<User>(Pair.second);
       assert((!First || Second) && "translated from user to non-user!?");
-      if (First)
+      // Operands of CallInst are skipped because they may not be Bool type,
+      // and their positions are defined by ABI.
+      if (First && !isa<CallInst>(First))
         for (unsigned i = 0; i < First->getNumOperands(); ++i)
           Second->setOperand(i, BoolToIntMap[First->getOperand(i)]);
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22243.66580.patch
Type: text/x-patch
Size: 2840 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160802/3251c14a/attachment.bin>


More information about the llvm-commits mailing list