[llvm-commits] Provide interface in TargetLowering to control jump table.
Jim Grosbach
grosbach at apple.com
Mon Sep 24 15:00:33 PDT 2012
LGTM. Thanks!
-j
On Sep 24, 2012, at 2:52 PM, Ron Lieberman <ronl at codeaurora.org> wrote:
> Jim, Sebastian
> Thanks for the suggestions.
> I have attached a newer patch incorporating your suggestions.
> Please let me know if there are any other issues.
>
> Ron
> ---
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by
> The Linux Foundation
>
> -----Original Message-----
> From: Jim Grosbach [mailto:grosbach at apple.com]
> Sent: Monday, September 24, 2012 3:07 PM
> To: Sebastian Pop
> Cc: Ron Lieberman; llvm-commits at cs.uiuc.edu for LLVM
> Subject: Re: [llvm-commits] Provide interface in TargetLowering to control
> jump table.
>
>
> On Sep 24, 2012, at 12:53 PM, Sebastian Pop <spop at codeaurora.org> wrote:
>
>> Hi Jim,
>>
>> On Mon, Sep 24, 2012 at 2:47 PM, Jim Grosbach <grosbach at apple.com> wrote:
>>> I don't have any conceptual problem with the patch (seems like a good
>>> idea), but the naming could use a bit of cleaning up. Specifically, see:
>>> http://llvm.org/docs/CodingStandards.html#the-low-level-issues
>>
>> I am not sure what names introduced by Ron's patch do not follow the
>> rules in the coding standards: could you please point out which ones?
>
> Sure thing. The name of the getter method and the TLI variable in
> particular.
>
>
>> From 31f2b6518a2db189490acb389ba1881962d311e4 Mon Sep 17 00:00:00 2001
>> From: Ron Lieberman <ronl at codeaurora.org>
>> Date: Fri, 21 Sep 2012 12:02:38 -0500
>> Subject: [PATCH] Provide interface in TargetLowering to control jump
>> table cutover for switches.
>>
>> cutoverJumpTables() defaults to 4.
>> Default is set to 5 for hexagon target.
>> ---
>> include/llvm/Target/TargetLowering.h | 15 +++++++++++++++
>> lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 5 +++--
>> lib/CodeGen/SelectionDAG/TargetLowering.cpp | 1 +
>> lib/Target/Hexagon/HexagonISelLowering.cpp | 2 ++
>> 4 files changed, 21 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/llvm/Target/TargetLowering.h
>> b/include/llvm/Target/TargetLowering.h
>> index ff51048..1673610 100644
>> --- a/include/llvm/Target/TargetLowering.h
>> +++ b/include/llvm/Target/TargetLowering.h
>> @@ -712,6 +712,12 @@ public:
>> return SupportJumpTables;
>> }
>>
>> + /// cutoverJumpTables - return integer threshold on number of
>> + blocks to /// use jump tables rather than if sequence.
>> + int cutoverJumpTables() const {
>> + return CutoverJumpTables;
>> + }
>
> This is a getter method and should be named as such (i.e., start with
> "get").
>
>> +
>> /// getStackPointerRegisterToSaveRestore - If a physical register, this
>> /// specifies the register that llvm.savestack/llvm.restorestack should
> save
>> /// and restore.
>> @@ -1032,6 +1038,12 @@ protected:
>> SupportJumpTables = Val;
>> }
>>
>> + /// setCutoverJumpTables - Indicate the number of blocks to cutover
>> + to /// jump tables.
>> + void setCutoverJumpTables(int Val) {
>> + CutoverJumpTables = Val;
>> + }
>> +
>> /// setStackPointerRegisterToSaveRestore - If set to a physical
> register, this
>> /// specifies the register that llvm.savestack/llvm.restorestack should
> save
>> /// and restore.
>> @@ -1826,6 +1838,9 @@ private:
>> /// If it's not true, then each jumptable must be lowered into
> if-then-else's.
>> bool SupportJumpTables;
>>
>> + /// CutoverJumpTables - Number of blocks threshld for using jump
> tables.
>
> s/threshld/threshold/
>
>> + int CutoverJumpTables;
>> +
>
> It's not clear from the name if this is a verb "cutover to jump tables!", a
> threshold, or something else. It's clear in the context of the rest of the
> patch, but it'd be better if the name itself were clearer. Something like
> "UseJumpTableThreshold" or "MinimumJumpTableEntries" perhaps? That's off the
> top of my head and could almost certainly be improved, but hopefully gives
> an idea of what I'm on about. Specifically, even knowing what this patch
> does, the name as chosen was confusing to me. I had to read things a couple
> of times to figure out what this actually represents.
>
>
>> /// BooleanContents - Information about the contents of the high-bits
> in
>> /// boolean values held in a type wider than i1. See
> getBooleanContents.
>> BooleanContent BooleanContents;
>> diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>> b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>> index 483b051..e81a3b9 100644
>> --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>> +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>> @@ -2093,7 +2093,7 @@ bool SelectionDAGBuilder::handleJTSwitchCase(CaseRec
> &CR,
>> for (CaseItr I = CR.Range.first, E = CR.Range.second; I != E; ++I)
>> TSize += I->size();
>>
>> - if (!areJTsAllowed(TLI) || TSize.ult(4))
>> + if (!areJTsAllowed(TLI) || TSize.ult(TLI.cutoverJumpTables()))
>> return false;
>>
>> APInt Range = ComputeRange(First, Last); @@ -2565,9 +2565,10 @@
>> void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
>> if (handleSmallSwitchRange(CR, WorkList, SV, Default, SwitchMBB))
>> continue;
>>
>> - // If the switch has more than 5 blocks, and at least 40% dense, and
> the
>> + // If the switch has more than N blocks, and is at least 40%
>> + dense, and the
>> // target supports indirect branches, then emit a jump table rather
> than
>> // lowering the switch to a binary tree of conditional branches.
>> + // N defaults to 4 and is controlled via TLS.cutoverJumpTables().
>> if (handleJTSwitchCase(CR, WorkList, SV, Default, SwitchMBB))
>> continue;
>>
>> diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>> b/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>> index 56f3a45..10d4727 100644
>> --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>> +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>> @@ -613,6 +613,7 @@ TargetLowering::TargetLowering(const TargetMachine
> &tm,
>> ShouldFoldAtomicFences = false;
>> InsertFencesForAtomic = false;
>> SupportJumpTables = true;
>> + CutoverJumpTables = 4;
>>
>> InitLibcallNames(LibcallRoutineNames);
>> InitCmpLibcallCCs(CmpLibcallCCs);
>> diff --git a/lib/Target/Hexagon/HexagonISelLowering.cpp
>> b/lib/Target/Hexagon/HexagonISelLowering.cpp
>> index 703a128..78d56d2 100644
>> --- a/lib/Target/Hexagon/HexagonISelLowering.cpp
>> +++ b/lib/Target/Hexagon/HexagonISelLowering.cpp
>> @@ -1350,6 +1350,8 @@
> HexagonTargetLowering::HexagonTargetLowering(HexagonTargetMachine
>> } else {
>> setOperationAction(ISD::BR_JT, MVT::Other, Expand);
>> }
>> + // Increase jump tables cutover to 5, was 4.
>
> This should be more explicit about what that means. That is, why this is
> being done not just what it's doing. Something along the lines of, "The
> default switch table formation has a minimum threshold of at least four
> basic block targets in the switch. For Hexxagon, this threshold is five
> because[.]".
>
>> + setCutoverJumpTables(5);
>>
>> setOperationAction(ISD::BR_CC, MVT::i32, Expand);
>>
>> --
>> 1.7.6.4
>>
>
>>
>> Thanks,
>> Sebastian
>> --
>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
>> hosted by The Linux Foundation
>
> <0001-TargetLowering-interface-to-set-get-minimum-block-en.patch>
More information about the llvm-commits
mailing list