[PATCH] [SeparateConstOffsetFromGEP] Bail there is only one GEP offset

Jingyue Wu jingyue at google.com
Tue Apr 21 11:15:49 PDT 2015


For example,

p1 = &base[offset + 1];
p2 = &base[offset + 2];

Reassociating GEPs gives us

p1 = (&base[offset]) + 1
p2 = (&base[offset]) + 2

where &base[offset] can be CSE'ed.

Can you show me the code patterns you discovered that demonstrates the
regression? I can think about how to address them too. Thanks!

Jingyue

On Tue, Apr 21, 2015 at 11:10 AM James Molloy <james at jamesmolloy.co.uk>
wrote:

> Hi Jingue,
>
> What could %offset be re associated with? It's just one variable- ok it
> could be multiplied by something, but the only real operation you can do on
> it is strength reduction.
>
> Enabling it pessimizes a bunch of code by creating unnecessary ptrtoints
> that the optimiser isn't as good at handling as GEPs. As a matter of fact,
> this patch is reenabling some aarch64 tests that currently fail.
>
> Can you give an example of when this would be useful?
> On Tue, 21 Apr 2015 at 17:45, David Blaikie <dblaikie at gmail.com> wrote:
>
>> On Tue, Apr 21, 2015 at 6:54 AM, James Molloy <james.molloy at arm.com>
>> wrote:
>>
>>> Hi jingyue, wu, Gerolf,
>>>
>>> A single-offset GEP such as:
>>>
>>>   getelementptr i8*, i8* %base, i32 %offset
>>>
>>
>> Just out of pedantry/by way of explanation, that should be: getelementptr
>> i8, i8* %base, ....
>>
>> (note the first type parameter is the type pointed to, not the pointer
>> type - this is part of the transition to opaque pointer types - so there
>> will be no "pointer to i8" in the future, just a raw pointer and operations
>> like gep will indicate how to treat the referenced bytes)
>>
>>
>>>
>>> doesn't make sense to split apart. There is no complex calculation to
>>> CSE.
>>>
>>> REPOSITORY
>>>   rL LLVM
>>>
>>> http://reviews.llvm.org/D9149
>>>
>>> Files:
>>>   lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
>>>   test/CodeGen/AArch64/arm64-addr-mode-folding.ll
>>>   test/CodeGen/AArch64/arm64-cse.ll
>>>   test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll
>>>
>>> Index: lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
>>> ===================================================================
>>> --- lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
>>> +++ lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
>>> @@ -829,7 +829,7 @@
>>>
>>>    // The backend can already nicely handle the case where all indices
>>> are
>>>    // constant.
>>> -  if (GEP->hasAllConstantIndices())
>>> +  if (GEP->hasAllConstantIndices() || GEP->getNumOperands() == 2)
>>>      return false;
>>>
>>>    bool Changed = canonicalizeArrayIndicesToPointerSize(GEP);
>>> Index: test/CodeGen/AArch64/arm64-addr-mode-folding.ll
>>> ===================================================================
>>> --- test/CodeGen/AArch64/arm64-addr-mode-folding.ll
>>> +++ test/CodeGen/AArch64/arm64-addr-mode-folding.ll
>>> @@ -1,4 +1,4 @@
>>> -; RUN: llc -O3 -mtriple arm64-apple-ios3 -aarch64-gep-opt=false %s -o -
>>> | FileCheck %s
>>> +; RUN: llc -O3 -mtriple arm64-apple-ios3 %s -o - | FileCheck %s
>>>  ; <rdar://problem/13621857>
>>>
>>>  @block = common global i8* null, align 8
>>> Index: test/CodeGen/AArch64/arm64-cse.ll
>>> ===================================================================
>>> --- test/CodeGen/AArch64/arm64-cse.ll
>>> +++ test/CodeGen/AArch64/arm64-cse.ll
>>> @@ -1,4 +1,4 @@
>>> -; RUN: llc -O3 < %s -aarch64-atomic-cfg-tidy=0 -aarch64-gep-opt=false
>>> -verify-machineinstrs | FileCheck %s
>>> +; RUN: llc -O3 < %s -aarch64-atomic-cfg-tidy=0 -verify-machineinstrs |
>>> FileCheck %s
>>>  target triple = "arm64-apple-ios"
>>>
>>>  ; rdar://12462006
>>> @@ -12,7 +12,7 @@
>>>  ; CHECK-NOT: sub
>>>  ; CHECK: b.ge
>>>  ; CHECK: sub
>>> -; CHECK: sub
>>> +; CHECK: {{sub|add}}
>>>  ; CHECK-NOT: sub
>>>  ; CHECK: ret
>>>   %0 = load i32, i32* %offset, align 4
>>> Index: test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll
>>> ===================================================================
>>> --- test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll
>>> +++ test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll
>>> @@ -237,7 +237,7 @@
>>>
>>>  ; The code that rebuilds an OR expression used to be buggy, and failed
>>> on this
>>>  ; test.
>>> -define float* @shl_add_or(i64 %a, float* %ptr) {
>>> +define float* @shl_add_or(i64 %a, [10 x float]* %ptr) {
>>>  ; CHECK-LABEL: @shl_add_or(
>>>  entry:
>>>    %shl = shl i64 %a, 2
>>> @@ -247,8 +247,8 @@
>>>    ; ((a << 2) + 12) and 1 have no common bits. Therefore,
>>>    ; SeparateConstOffsetFromGEP is able to extract the 12.
>>>    ; TODO(jingyue): We could reassociate the expression to combine 12
>>> and 1.
>>> -  %p = getelementptr float, float* %ptr, i64 %or
>>> -; CHECK: [[PTR:%[a-zA-Z0-9]+]] = getelementptr float, float* %ptr, i64
>>> [[OR]]
>>> +  %p = getelementptr [10 x float], [10 x float]* %ptr, i64 %or, i64 0
>>> +; CHECK: [[PTR:%[a-zA-Z0-9]+]] = getelementptr [10 x float], [10 x
>>> float]* %ptr, i64 [[OR]], i64 0
>>>  ; CHECK: getelementptr float, float* [[PTR]], i64 12
>>>    ret float* %p
>>>  ; CHECK-NEXT: ret
>>>
>>> EMAIL PREFERENCES
>>>   http://reviews.llvm.org/settings/panel/emailpreferences/
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
> _______________________________________________
> 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/20150421/6237a235/attachment.html>


More information about the llvm-commits mailing list