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

Carrot Wei via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 18 19:56:55 PDT 2016


Ping

On Mon, Jul 11, 2016 at 4:08 PM, Guozhi Wei <carrot at google.com> wrote:

> Carrot created this revision.
> Carrot added a reviewer: hfinkel.
> Carrot added a subscriber: llvm-commits.
> Herald added a subscriber: nemanjai.
>
> This patch fixes pr25548.
>
> 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.
>
> http://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,8 @@
>      while (!WorkList.empty()) {
>        Value *Curr = WorkList.back();
>        WorkList.pop_back();
> -      if (User *CurrUser = dyn_cast<User>(Curr))
> +      User *CurrUser = dyn_cast<User>(Curr);
> +      if (CurrUser && !isa<CallInst>(Curr))
>          for (auto &Op : CurrUser->operands())
>            if (Defs.insert(Op).second)
>              WorkList.push_back(Op);
> @@ -199,11 +200,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)
> @@ -227,7 +229,7 @@
>        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)
> +      if (First && !isa<CallInst>(First))
>          for (unsigned i = 0; i < First->getNumOperands(); ++i)
>            Second->setOperand(i, BoolToIntMap[First->getOperand(i)]);
>      }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160718/a7e28db0/attachment.html>


More information about the llvm-commits mailing list