[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