[llvm] r274843 - Code size optimisation: don't expand a div to a mul and and a shift sequence.

Sjoerd Meijer via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 8 06:58:33 PDT 2016


Agreed and I am fixing this at the moment.
I actually now see that I want to do the same for UDIV, but I will create a phabricator diff for that one.
Thanks.

-----Original Message-----
From: Benjamin Kramer [mailto:benny.kra at gmail.com]
Sent: 08 July 2016 14:33
To: Sjoerd Meijer
Cc: Chandler Carruth via llvm-commits
Subject: Re: [llvm] r274843 - Code size optimisation: don't expand a div to a mul and and a shift sequence.

On Fri, Jul 8, 2016 at 2:54 PM, Sjoerd Meijer via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> Author: sjoerdmeijer
> Date: Fri Jul  8 07:54:43 2016
> New Revision: 274843
>
> URL: http://llvm.org/viewvc/llvm-project?rev=274843&view=rev
> Log:
> Code size optimisation: don't expand a div to a mul and and a shift sequence.
> As a result, the urem instruction will not be expanded to a sequence
> of umull, lsrs, muls and sub instructions, but just a call to __aeabi_uidivmod.

This has historically been one of the things that we intentionally didn't do at -Os because it can significantly affect runtime with only a minor gain in code size, especially when there is no hardware div available. I'm still not sure that this is a good fit for -Os, and would prefer if we did it for -Oz only. Does that still solve your use case?

>
> Differential Revision: http://reviews.llvm.org/D22131
>
> Added:
>     llvm/trunk/test/CodeGen/ARM/urem-opt-size.ll
> Modified:
>     llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDA
> G/DAGCombiner.cpp?rev=274843&r1=274842&r2=274843&view=diff
> ======================================================================
> ========
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Jul  8
> +++ 07:54:43 2016
> @@ -14516,6 +14516,11 @@ SDValue DAGCombiner::BuildSDIVPow2(SDNod  ///
> number.
>  /// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
>  SDValue DAGCombiner::BuildUDIV(SDNode *N) {
> +  // when optimising for size, we don't want to expand a div to a mul
> + and  // and a shift.
> +  if (ForCodeSize)
> +    return SDValue();
> +
>    ConstantSDNode *C = isConstOrConstSplat(N->getOperand(1));
>    if (!C)
>      return SDValue();
>
> Added: llvm/trunk/test/CodeGen/ARM/urem-opt-size.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/urem-o
> pt-size.ll?rev=274843&view=auto
> ======================================================================
> ========
> --- llvm/trunk/test/CodeGen/ARM/urem-opt-size.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/urem-opt-size.ll Fri Jul  8 07:54:43
> +++ 2016
> @@ -0,0 +1,25 @@
> +; When optimising for size, we don't want to expand a div to a mul
> +and ; and a shift sequence. As a result, the urem instruction will
> +not be ; expanded to a sequence of umull, lsrs, muls and sub
> +instructions, but ; just a call to __aeabi_uidivmod.
> +;
> +; RUN: llc -mtriple=armv7a-eabi -mattr=-neon -verify-machineinstrs %s
> +-o - | FileCheck %s
> +
> +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
> +target triple = "thumbv7m-arm-none-eabi"
> +
> +define i32 @foo() local_unnamed_addr #0 {
> +entry:
> +; CHECK-LABEL: foo:
> +; CHECK: __aeabi_uidivmod
> +; CHECK-NOT: umull
> +  %call = tail call i32 bitcast (i32 (...)* @GetValue to i32 ()*)()
> +  %rem = urem i32 %call, 1000000
> +  %cmp = icmp eq i32 %rem, 0
> +  %conv = zext i1 %cmp to i32
> +  ret i32 %conv
> +}
> +
> +declare i32 @GetValue(...) local_unnamed_addr
> +
> +attributes #0 = { minsize nounwind optsize }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.


More information about the llvm-commits mailing list