[llvm-commits] [llvm] r158237 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineAddSub.cpp test/Transforms/InstCombine/pr12338.ll

Nuno Lopes nunoplopes at sapo.pt
Wed Jun 13 05:48:44 PDT 2012


It's true that in general instcombine tries to push immediates to the RHS. 
But the case of '%b = sub i32 42, %a' is an exception.
The deal is that to represent such a subtraction but with the immediate on 
RHS, one needs an additional negate instruction (which is nothing more than 
'sub 0, %foo'). So you would end up with an immediate in LHS anyway.

So the choices are:
%b = sub i32 42, %a
vs
%tmp = add i32 %a, -42
%b = sub i32 0, %tmp

Instcombine prefers the first form (and already did before my change).

Nuno

P.S.: Forgot to acknowledge in the commit, but thanks to Nick Lewycky for 
reducing the test case!


-----Original Message-----
From: Evan Cheng
Sent: Tuesday, June 12, 2012 2:37 AM

Is this really right? I thought LLVM passes like to canonicalize expressions 
so the immediate is always the RHS.

Evan

On Jun 8, 2012, at 3:30 PM, Nuno Lopes wrote:

> Author: nlopes
> Date: Fri Jun  8 17:30:05 2012
> New Revision: 158237
>
> URL: http://llvm.org/viewvc/llvm-project?rev=158237&view=rev
> Log:
> canonicalize:
> -%a + 42
> into
> 42 - %a
>
> previously we were emitting:
> -(%a + 42)
>
> This fixes the infinite loop in PR12338. The generated code is still not 
> perfect, though.
> Will work on that next
>
> Added:
>    llvm/trunk/test/Transforms/InstCombine/pr12338.ll
> Modified:
>    llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp?rev=158237&r1=158236&r2=158237&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp Fri Jun  8 
> 17:30:05 2012
> @@ -170,10 +170,11 @@
>   // -A + B  -->  B - A
>   // -A + -B  -->  -(A + B)
>   if (Value *LHSV = dyn_castNegVal(LHS)) {
> -    if (Value *RHSV = dyn_castNegVal(RHS)) {
> -      Value *NewAdd = Builder->CreateAdd(LHSV, RHSV, "sum");
> -      return BinaryOperator::CreateNeg(NewAdd);
> -    }
> +    if (!isa<Constant>(RHS))
> +      if (Value *RHSV = dyn_castNegVal(RHS)) {
> +        Value *NewAdd = Builder->CreateAdd(LHSV, RHSV, "sum");
> +        return BinaryOperator::CreateNeg(NewAdd);
> +      }
>
>     return BinaryOperator::CreateSub(RHS, LHSV);
>   }
>
> Added: llvm/trunk/test/Transforms/InstCombine/pr12338.ll
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/pr12338.ll?rev=158237&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/pr12338.ll (added)
> +++ llvm/trunk/test/Transforms/InstCombine/pr12338.ll Fri Jun  8 17:30:05 
> 2012
> @@ -0,0 +1,24 @@
> +; RUN: opt < %s -instcombine -S | FileCheck %s
> +
> +define void @entry() nounwind {
> +entry:
> +  br label %for.cond
> +
> +for.cond:
> +  %local = phi <1 x i32> [ <i32 0>, %entry ], [ %phi2, %cond.end47 ]
> +; CHECK: sub <1 x i32> <i32 92>, %local
> +  %phi3 = sub <1 x i32> zeroinitializer, %local
> +  br label %cond.end
> +
> +cond.false:
> +  br label %cond.end
> +
> +cond.end:
> +  %cond = phi <1 x i32> [ %phi3, %for.cond ], [ undef, %cond.false ]
> +  br label %cond.end47
> +
> +cond.end47:
> +  %sum = add <1 x i32> %cond, <i32 92>
> +  %phi2 = sub <1 x i32> zeroinitializer, %sum
> +  br label %for.cond
> +} 




More information about the llvm-commits mailing list