[llvm-commits] [llvm] r131789 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineCalls.cpp test/Transforms/InstCombine/intrinsics.ll

Chris Lattner clattner at apple.com
Sat May 21 10:34:07 PDT 2011


On May 21, 2011, at 2:22 AM, Benjamin Kramer wrote:

> Author: d0k
> Date: Sat May 21 04:22:06 2011
> New Revision: 131789
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=131789&view=rev
> Log:
> InstCombine: Turn mul.with.overflow(X, 2) into the cheaper add.with.overflow(X, X)

Hi Benjamin,

Can we do this at codegen time?  The former is more canonical, since it reduces the # of uses of X.

-Chris

> 
> Modified:
>    llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
>    llvm/trunk/test/Transforms/InstCombine/intrinsics.ll
> 
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=131789&r1=131788&r2=131789&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Sat May 21 04:22:06 2011
> @@ -535,6 +535,20 @@
>         Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
>         return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
>       }
> +
> +      // [su]mul.with.overflow(X, 2) -> [su]add.with.overflow(X, X)
> +      if (RHSI->equalsInt(2)) {
> +        Intrinsic::ID Add =
> +          II->getIntrinsicID() == Intrinsic::smul_with_overflow ?
> +          Intrinsic::sadd_with_overflow : Intrinsic::uadd_with_overflow;
> +
> +        Module *M = II->getParent()->getParent()->getParent();
> +        const Type *Ty = RHSI->getType();
> +        Function *F = Intrinsic::getDeclaration(M, Add, &Ty, 1);
> +
> +        Value *Ops[] = { II->getArgOperand(0), II->getArgOperand(0) };
> +        return CallInst::Create(F, Ops, Ops+2);
> +      }
>     }
>     break;
>   case Intrinsic::ppc_altivec_lvx:
> 
> Modified: llvm/trunk/test/Transforms/InstCombine/intrinsics.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/intrinsics.ll?rev=131789&r1=131788&r2=131789&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/intrinsics.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/intrinsics.ll Sat May 21 04:22:06 2011
> @@ -114,6 +114,7 @@
> 
> %ov.result.32 = type { i32, i1 }
> declare %ov.result.32 @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
> +declare %ov.result.32 @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
> 
> define i32 @umultest3(i32 %n) nounwind {
>   %shr = lshr i32 %n, 2
> @@ -139,6 +140,26 @@
> ; CHECK: umul.with.overflow
> }
> 
> +define i32 @umultest5(i32 %n) nounwind {
> +  %mul = call %ov.result.32 @llvm.umul.with.overflow.i32(i32 %n, i32 2)
> +  %ov = extractvalue %ov.result.32 %mul, 1
> +  %res = extractvalue %ov.result.32 %mul, 0
> +  %ret = select i1 %ov, i32 -1, i32 %res
> +  ret i32 %ret
> +; CHECK: @umultest5
> +; CHECK: llvm.uadd.with.overflow.i32(i32 %n, i32 %n)
> +}
> +
> +define i32 @smultest1(i32 %n) nounwind {
> +  %mul = call %ov.result.32 @llvm.smul.with.overflow.i32(i32 %n, i32 2)
> +  %ov = extractvalue %ov.result.32 %mul, 1
> +  %res = extractvalue %ov.result.32 %mul, 0
> +  %ret = select i1 %ov, i32 -1, i32 %res
> +  ret i32 %ret
> +; CHECK: @smultest1
> +; CHECK: llvm.sadd.with.overflow.i32(i32 %n, i32 %n)
> +}
> +
> define void @powi(double %V, double *%P) {
> entry:
>   %A = tail call double @llvm.powi.f64(double %V, i32 -1) nounwind
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list