[all-commits] [llvm/llvm-project] 896333: [DAGCombiner] fold shift-trunc-shift to shift-mask...

RotateRight via All-commits all-commits at lists.llvm.org
Thu Dec 12 12:44:19 PST 2019


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 8963332c3327daa652ba3e26d35f9109b6991985
      https://github.com/llvm/llvm-project/commit/8963332c3327daa652ba3e26d35f9109b6991985
  Author: Sanjay Patel <spatel at rotateright.com>
  Date:   2019-12-12 (Thu, 12 Dec 2019)

  Changed paths:
    M llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
    M llvm/test/CodeGen/AArch64/shift-amount-mod.ll
    M llvm/test/CodeGen/PowerPC/trunc-srl-load.ll

  Log Message:
  -----------
  [DAGCombiner] fold shift-trunc-shift to shift-mask-trunc

This fold is done in IR by instcombine, and we have a special
form of it already here in DAGCombiner, but we want the more
general transform too:
https://rise4fun.com/Alive/3jZm

Name: general
Pre: (C1 + zext(C2) < 64)
%s = lshr i64 %x, C1
%t = trunc i64 %s to i16
%r = lshr i16 %t, C2
=>
%s2 = lshr i64 %x, C1 + zext(C2)
%a = and i64 %s2, zext((1 << (16 - C2)) - 1)
%r = trunc %a to i16

Name: special
Pre: C1 == 48
%s = lshr i64 %x, C1
%t = trunc i64 %s to i16
%r = lshr i16 %t, C2
=>
%s2 = lshr i64 %x, C1 + zext(C2)
%r = trunc %s2 to i16

...because D58017 exposes a regression without this fold.




More information about the All-commits mailing list