[PATCH] D66991: [PowerPC] Fix SH field overflow issue

Yi-Hong Lyu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 30 00:40:40 PDT 2019


Yi-Hong.Lyu marked 2 inline comments as done.
Yi-Hong.Lyu added inline comments.


================
Comment at: llvm/test/CodeGen/PowerPC/sh-overflow.mir:1
+# RUN: llc -O3 -mtriple=powerpc64le-unknown-linux-gnu -start-after=phi-node-elimination -ppc-asm-full-reg-names -verify-machineinstrs %s -o - | FileCheck %s
+
----------------
jsji wrote:
> nemanjai wrote:
> > jsji wrote:
> > > `-start-after=phi-node-elimination` ? Why not `start-before=ppc-mi-peepholes`? Does this imply that we rely on some other passes to generate the necessary input?
> > > 
> > > Can you come up with one that works with either `start-before=ppc-mi-peepholes` or `-start-after ppc-mi-peepholes -ppc-late-peephole `?
> > Yes, let's change the test case to have 2 RUN lines. One starts before MI Peephole. The other starts after it. The checks should be the same for both as we should do the right thing in both places.
> > 
> > Also, please do not talk about the "current state of things" or "what the patch fixes" in the source/tests. These statements make sense only in the context of the patch now, but later down the road, such statements are meaningless. It should suffice to say something like:
> > "Ensure we do not attempt to transform this into `srwi $r3, $r3, 0` in the form specified by ISA 3.0b (`rlwinm $r3, $r3, 32 - 0, 0, 31`)"
> Good point.
Given the MIR:
```
$ cat special_right_shift32_0.mir
---
name:            test
alignment:       2
tracksRegLiveness: true
registers:
  - { id: 0, class: gprc }
  - { id: 1, class: gprc }
  - { id: 2, class: gprc }
liveins:
  - { reg: '$r3', virtual-reg: '%0' }
machineFunctionInfo: {}
body:             |
  bb.0.entry:
    liveins: $r3

    %1:gprc = LI 0
    %0:gprc = COPY $r3
    %2:gprc = SRW %0, %1
    $r3 = COPY %2
    BLR implicit $lr, implicit $rm, implicit $r3

...

```
```
$ llc -O3 -mtriple=powerpc64-unknown-linux-gnu -start-before=ppc-mi-peepholes special_right_shift32_0.mir -o special_right_shift32_0.before.s
$ llc -O3 -mtriple=powerpc64-unknown-linux-gnu -start-after=ppc-mi-peepholes -ppc-late-peephole special_right_shift32_0.mir -o special_right_shift32_0.after.s
$ diff special_right_shift32_0.before.s special_right_shift32_0.after.s
15a16
>       slwi 3, 3, 0
```
All the assembly in special_right_shift32_0.before.s is optimized out and it contains only `blr`[1]. In contrast,  special_right_shift32_0.after.s has expected output[2]. That is, we get different results for the 2 RUN lines.

[1]
```
$ cat special_right_shift32_0.before.s
        .text
        .file   "special_right_shift32_0.mir"
        .globl  test                    # -- Begin function test
        .p2align        2
        .type   test, at function
        .section        .opd,"aw", at progbits
test:                                   # @test
        .p2align        3
        .quad   .Lfunc_begin0
        .quad   .TOC. at tocbase
        .quad   0
        .text
.Lfunc_begin0:
        .cfi_startproc
# %bb.0:                                # %entry
        blr
        .long   0
        .quad   0
.Lfunc_end0:
        .size   test, .Lfunc_end0-.Lfunc_begin0
        .cfi_endproc
                                        # -- End function

        .section        ".note.GNU-stack","", at progbits

```
[2]
```
$ cat special_right_shift32_0.after.s
        .text
        .file   "special_right_shift32_0.mir"
        .globl  test                    # -- Begin function test
        .p2align        2
        .type   test, at function
        .section        .opd,"aw", at progbits
test:                                   # @test
        .p2align        3
        .quad   .Lfunc_begin0
        .quad   .TOC. at tocbase
        .quad   0
        .text
.Lfunc_begin0:
        .cfi_startproc
# %bb.0:                                # %entry
        slwi 3, 3, 0
        blr
        .long   0
        .quad   0
.Lfunc_end0:
        .size   test, .Lfunc_end0-.Lfunc_begin0
        .cfi_endproc
                                        # -- End function

        .section        ".note.GNU-stack","", at progbits
```


================
Comment at: llvm/test/CodeGen/PowerPC/sh-overflow.mir:50
+frameInfo:
+  maxAlignment:    1
+machineFunctionInfo: {}
----------------
jsji wrote:
> Yi-Hong.Lyu wrote:
> > jsji wrote:
> > > nit: `alignment` and `maxAlignment` seems random here, any reason you want to use 1 here?
> > The special_right_shift32_0 is derived from
> > ```
> > unsigned int test(unsigned int a, unsigned int b) {
> >   return a >> b;
> > }
> > ```
> > generated by `clang --target=powerpc-unknown-unknown`. In contrast, the special_right_shift64_0 is  derived from
> > ```
> > unsigned long test(unsigned long a, unsigned long b) {
> >   return a >> b;
> > }
> > ```
> > generated by `clang --target=powerpc64-unknown-unknown`. I just leave `alignment` and `maxAlignment` as it is. What alignment and maxAlignment  do you think it should be?
> Thanks for explanation.  I don't have specific number in mind, just wondering why it is 1? since it is smaller than 2 above.
According to https://llvm.org/docs/MIRLangRef.html#simplifying-mir-files:
```
The whole frameInfo section is often unnecessary if there is no special frame usage in the function. 
```
Would remove the whole frameInfo section and leave `alignment:       2 `there for both  cases.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66991/new/

https://reviews.llvm.org/D66991





More information about the llvm-commits mailing list