diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2009-12-12 23:23:43 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2009-12-12 23:23:43 +0000 |
| commit | 96cf7f42b057b6d1ed8f41a88d76607dfb5fb8ee (patch) | |
| tree | 04798495411069cf9babb751fc55716886401e8f /llvm/lib | |
| parent | efa39f7db181aa79dcc85c27fe947c0bff79be42 (diff) | |
| download | bcm5719-llvm-96cf7f42b057b6d1ed8f41a88d76607dfb5fb8ee.tar.gz bcm5719-llvm-96cf7f42b057b6d1ed8f41a88d76607dfb5fb8ee.zip | |
More info on this transformation.
llvm-svn: 91230
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/README.txt | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/llvm/lib/Target/README.txt b/llvm/lib/Target/README.txt index 2917f71869c..e1772c2ead0 100644 --- a/llvm/lib/Target/README.txt +++ b/llvm/lib/Target/README.txt @@ -801,8 +801,21 @@ void bar(unsigned n) { true(); } -I think this basically amounts to a dag combine to simplify comparisons against -multiply hi's into a comparison against the mullo. +This is equivalent to the following, where 2863311531 is the multiplicative +inverse of 3, and 1431655766 is ((2^32)-1)/3+1: +void bar(unsigned n) { + if (n * 2863311531U < 1431655766U) + true(); +} + +The same transformation can work with an even modulo with the addition of a +rotate: rotate the result of the multiply to the right by the number of bits +which need to be zero for the condition to be true, and shrink the compare RHS +by the same amount. Unless the target supports rotates, though, that +transformation probably isn't worthwhile. + +The transformation can also easily be made to work with non-zero equality +comparisons: just transform, for example, "n % 3 == 1" to "(n-1) % 3 == 0". //===---------------------------------------------------------------------===// |

