[llvm-commits] Request for Review - avoid register pressure with read/modify/write instructions
Evan Cheng
evan.cheng at apple.com
Wed Mar 28 13:13:08 PDT 2012
Patch looks good. Please merge the tests into dec-eflags-lower.ll. We should rename dec-eflags-lower.ll to something like rmw-eflags.ll.
Evan
On Mar 28, 2012, at 11:12 AM, Joel Jones <joel_k_jones at apple.com> wrote:
> This is a code change to add support for changing instruction sequences of the form:
>
> load
> inc/dec of 8/16/32/64 bits
> store
>
> into the appropriate X86 inc/dec through memory instruction:
>
> inc[qlwb] / dec[qlwb]
>
> The change is in lib/Target/X86/X86ISelDAGToDAG.cpp, an svn diff of which is attached.
> Also attached is a test case for test/CodeGen/X86. The checks that were in
> X86DAGToDAGISel::Select(SDNode *Node)>>ISD::STORE have been extracted
> to isLoadIncOrDecStore and reworked to use the better
> named wrappers for getOperand(unsigned) and replaced Chain.getNode()
> with LoadNode. I have also expanded the comments.
>
> To address the reviewer's comments:
>
> With the expanded comments, I think the broken down checks are more appropriate;
> q.v. http://llvm.org/docs/CodingStandards.html#hl_earlyexit
>
> I also prefer NOT/OR/== to AND/!= when all the left operands of the comparison operators
> are the same, as I think it more clearly expresses the intent of "if the value being examined
> isn't A or B, then do something"
>
> Joel
> <X86ISelDAGToDAG.cpp.diff>
> <readModWrite.ll>
>
>
> On Mar 27, 2012, at 6:28 PM, Evan Cheng wrote:
>
>> More nitpicks:
>>
>> + if (Undef->getOpcode() != ISD::UNDEF) return false;
>> + if (Chain->getOpcode() != ISD::LOAD) return false;
>> + if (!(Opc == X86ISD::DEC || Opc == X86ISD::INC)) return false;
>> + if (StoredVal.getResNo() != 0) return false;
>> + if (!StoredVal.getNode()->hasNUsesOfValue(1, 0)) return false;
>> + if (!Chain.getNode()->hasNUsesOfValue(1, 0)) return false;
>> + if (StoredVal->getOperand(0).getNode() != Chain.getNode()) return false;
>>
>> There is no good reason to separate each condition into a separate check. I would, for example, combine the first two. I would also combine the StoredVal checks.
>>
>> + if (!(Opc == X86ISD::DEC || Opc == X86ISD::INC)) return false;
>> Why not
>> + if (Opc != X86ISD::DEC && Opc != X86ISD::INC)
>> return false;
>> And this probably should be the first check.
>>
>> Please also include test cases so the reviewer can commit the patch for you once it passes inspection.
>>
>> Evan
>>
>> On Mar 27, 2012, at 4:05 PM, Joel Jones wrote:
>>
>>> I have made the changes as requested and have attached the diff.
>>>
>>> Joel
>>> <X86OISelDAGToDAG.cpp.diff>
>>>
>>> On Mar 27, 2012, at 10:58 AM, Evan Cheng wrote:
>>>
>>>> Comments:
>>>>
>>>> I know some of the issues were there before your patch. But please correct them while you are at it.
>>>>
>>>> Can you add some comments to isLdIncOrDecSt? There should be at least top level comments. Also I think there is a bug in this. Please check if the load is a non-indexed, non-extending load (using isNormalLoad()). Similarly, please make sure the store is not a truncating store.
>>>>
>>>> int memSize = StoreNode->getMemOperand()->getSize();
>>>> Please do not depend on memoperand for this. LSBaseSDNode has MemVT field. Or better yet, just use Load's ValueType. So replace
>>>>
>>>> + if (!(memSize == 8 || memSize == 4 || memSize == 2 || memSize == 1))
>>>> + return false;
>>>>
>>>> with something like:
>>>> if (LdVT != MVT::i8 && LdVT != MVT::i16 && LdVT != MVT::i32 && LdVT != MVT::i64)
>>>> return false;
>>>>
>>>> newIncDecOpc() has some formatting issues. Indentation width should be 2.
>>>>
>>>> One more nitpick. The names for these functions look weird. How about isLoadIncDecStore? getFusedLdStOpcode?
>>>>
>>>> Evan
>>>>
>>>> On Mar 26, 2012, at 6:01 PM, Joel Jones <joel_k_jones at apple.com> wrote:
>>>>
>>>>> This is a code change to add support for changing instruction sequences of the form:
>>>>> load
>>>>> inc/dec of 8/16/32/64 bits
>>>>> store
>>>>> into the appropriate X86 inc/dec instruction:
>>>>> inc[qlwb]/dec[qlwb]
>>>>>
>>>>> The change is in lib/Target/X86/X86ISelDAGToDAG.cpp, an svn diff of which is attached.
>>>>> Also attached is a test case.
>>>>>
>>>>> Joel Jones
>>>>>
>>>>> <X86OISelDAGToDAG.cpp.diff><readModWrite.ll>_______________________________________________
>>>>> llvm-commits mailing list
>>>>> llvm-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120328/9d1d04c2/attachment.html>
More information about the llvm-commits
mailing list