[PATCH] D92089: [PowerPC] Materialize i64 constants by enumerated patterns.

EsmeYi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 10 19:18:12 PST 2020


Esme added inline comments.


================
Comment at: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:899
+  // after rotation.
+  if ((LZ + FO + TO) > 48) {
+    Result = CurDAG->getMachineNode(PPC::LI8, dl, MVT::i64,
----------------
stefanp wrote:
> One more question: Isn't this the pattern above just a subset of this one?
> 
> ```
> if ((LZ + TO) > 48) {
>  ...
> }
> 
> if ((LZ + FO + TO) > 48) {
>   ...
> }
> ```
> They both use only two instructions to materialize the constant. If you delete the first one the second one will also catch all of those cases and be the same number of instructions.
> One more question: Isn't this the pattern above just a subset of this one?
> 
> ```
> if ((LZ + TO) > 48) {
>  ...
> }
> 
> if ((LZ + FO + TO) > 48) {
>   ...
> }
> ```
> They both use only two instructions to materialize the constant. If you delete the first one the second one will also catch all of those cases and be the same number of instructions.

They are similar but different :D  The patterns are very tricky indeed. Hope the following sketches can make you clear.
First one (LZ + TO) > 48
```
  // +--LZ--||-15-bit-||--TO--+     +-------------|--16-bit--+
  // |00000001bbbbbbbbb1111111| ->  |00000000000001bbbbbbbbb1|
  // +------------------------+     +------------------------+
  // 63                      0      63                      0
  //          Imm                   (Imm >> (48 - LZ) & 0xffff)
  // +----sext-----|--16-bit--+     +clear-|-----------------+
  // |11111111111111bbbbbbbbb1| ->  |00000001bbbbbbbbb1111111|
  // +------------------------+     +------------------------+
  // 63                      0      63                      0
  // LI8 : sext many leading zeros   RLDICL : rotate left (48 - LZ), clear left LZ
```
Second one (LZ + FO + TO) > 48 (I will add this in next update)
```
  // +-LZ-FO||-15-bit-||--TO--+     +-------------|--16-bit--+
  // |00011110bbbbbbbbb1111111| ->  |000000000011110bbbbbbbbb|
  // +------------------------+     +------------------------+
  // 63                      0      63                      0
  //            Imm                    (Imm >> TO) & 0xffff
  // +----sext-----|--16-bit--+     +LZ|---------------------+
  // |111111111111110bbbbbbbbb| ->  |00011110bbbbbbbbb1111111|
  // +------------------------+     +------------------------+
  // 63                      0      63                      0
  // LI8 : sext many leading zeros   RLDICL : rotate left TO, clear left LZ
```
Assume we use the second pattern to handle the first case :
```
  // +--LZ--||-15-bit-||--TO--+     +--------------|-15-bit--+
  // |00000001bbbbbbbbb1111111| ->  |000000000000001bbbbbbbbb|
  // +------------------------+     +------------------------+
  // 63                      0      63                      0
  //         Imm                       (Imm >> TO) & 0xffff)
  // +----sext------|-15-bit--+     +------------------------+
  // |000000000000001bbbbbbbbb| ->  |00000001bbbbbbbbb0000000|
  // +------------------------+     +------------------------+
  // 63                      0      63                      0
  // LI : no leading ones             incorrect result :(
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D92089



More information about the llvm-commits mailing list