Commit Graph

480 Commits

Author SHA1 Message Date
Sanjay Patel 77028e31e5 [InstSimplify] use isKnownNeverNaN to fold more fcmp ord/uno
Remove duplicate tests from InstCombine that were added with
D50582. I left negative tests there to verify that nothing
in InstCombine tries to go overboard. If isKnownNeverNaN is
improved to handle the FP binops or other cases, we should
have coverage under InstSimplify, so we could remove more
duplicate tests from InstCombine at that time.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@340279 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-21 14:45:13 +00:00
Sanjay Patel 7ba25f54f9 [InstSimplify] add tests for FP uno/ord with nnan; NFC
This is a slight modification of the tests from D50582;
change half of the predicates to 'uno' so we have coverage
for that side too. All of the positive tests can fold to a
constant (true/false), so that should happen in instsimplify.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@340276 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-21 13:33:13 +00:00
Sanjay Patel 54b09599fc [InstSimplify] move minnum/maxnum with Inf folds from instcombine
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339396 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-09 22:20:44 +00:00
Sanjay Patel c517d08361 [InstSimplify] fold fsub+fadd with common operand
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339176 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-07 20:32:55 +00:00
Sanjay Patel a5d9c8f92a [InstSimplify] fold fadd+fsub with common operand
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339174 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-07 20:23:49 +00:00
Sanjay Patel c10f372ba1 [InstSimplify] fold fsub+fsub with common operand
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339171 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-07 20:14:27 +00:00
Sanjay Patel b651cfc711 [InstSimplify] add tests for fadd/fsub; NFC
Instcombine gets some, but not all, of these cases via
it's internal reassociation transforms. It fails in
all cases with vector types.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339168 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-07 19:49:13 +00:00
Sanjay Patel 5ab217ce42 [InstSimplify] move minnum/maxnum with common op fold from instcombine
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339144 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-07 14:36:27 +00:00
Sanjay Patel 7e35c221fb [InstSimplify] add tests for minnum/maxnum with shared op; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339142 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-07 14:13:40 +00:00
Sanjay Patel 1b7b25a023 [InstSimplify] move misplaced minnum/maxnum tests; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339141 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-07 14:12:08 +00:00
Matt Arsenault 4e1ab5cbfb ValueTracking: Handle canonicalize in CannotBeNegativeZero
Also fix apparently missing test coverage for any of the
handling here.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339023 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-06 15:16:26 +00:00
Hiroshi Inoue ebab95406f [InstSimplify] fold extracting from std::pair (2/2)
This is the second patch of the series which intends to enable jump threading for an inlined method whose return type is std::pair<int, bool> or std::pair<bool, int>. 
The first patch is https://reviews.llvm.org/rL338485.

This patch handles code sequences that merges two values using `shl` and `or`, then extracts one value using `and`.

Differential Revision: https://reviews.llvm.org/D49981



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338817 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-03 05:39:48 +00:00
Sanjay Patel e1c9b76cd3 [InstSimplify] move minnum/maxnum with undef fold from instcombine
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338719 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-02 14:33:40 +00:00
Sanjay Patel fd0862123d [ValueTracking] fix maxnum miscompile for cannotBeOrderedLessThanZero (PR37776)
This adds the NAN checks suggested in PR37776:
https://bugs.llvm.org/show_bug.cgi?id=37776

If both operands to maxnum are NAN, that should get constant folded, so we don't 
have to handle that case. This is the same assumption as other FP ops in this
function. Returning 'false' is always conservatively correct.

Copying from the bug report:

Currently, we have this for "when is cannotBeOrderedLessThanZero 
(mustBePositiveOrNaN) true for maxnum":
               L
        -------------------
        | Pos | Neg | NaN |
   ------------------------
   |Pos |  x  |  x  |  x  |
   ------------------------
 R |Neg |  x  |     |  x  |
   ------------------------
   |NaN |  x  |  x  |  x  |
   ------------------------


The cases with (Neg & NaN) are wrong. We should have:

                L
        -------------------
        | Pos | Neg | NaN |
   ------------------------
   |Pos |  x  |  x  |  x  |
   ------------------------
 R |Neg |  x  |     |     |
   ------------------------
   |NaN |  x  |     |  x  |
   ------------------------

Differential Revision: https://reviews.llvm.org/D50081



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338716 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-02 13:46:20 +00:00
Sanjay Patel 5ea9eaae86 [InstSimplify] move minnum/maxnum with same arg fold from instcombine
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338652 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-01 23:05:55 +00:00
Hiroshi Inoue d967b3d2e7 [InstSimplify] fold extracting from std::pair (1/2)
This patch intends to enable jump threading when a method whose return type is std::pair<int, bool> or std::pair<bool, int> is inlined.
For example, jump threading does not happen for the if statement in func.

std::pair<int, bool> callee(int v) {
  int a = dummy(v);
  if (a) return std::make_pair(dummy(v), true);
  else return std::make_pair(v, v < 0);
}

int func(int v) {
  std::pair<int, bool> rc = callee(v);
  if (rc.second) {
    // do something
  }

SROA executed before the method inlining replaces std::pair by i64 without splitting in both callee and func since at this point no access to the individual fields is seen to SROA.
After inlining, jump threading fails to identify that the incoming value is a constant due to additional instructions (like or, and, trunc).

This series of patch add patterns in InstructionSimplify to fold extraction of members of std::pair. To help jump threading, actually we need to optimize the code sequence spanning multiple BBs.
These patches does not handle phi by itself, but these additional patterns help NewGVN pass, which calls instsimplify to check opportunities for simplifying instructions over phi, apply phi-of-ops optimization to result in successful jump threading. 
SimplifyDemandedBits in InstCombine, can do more general optimization but this patch aims to provide opportunities for other optimizers by supporting a simple but common case in InstSimplify.

This first patch in the series handles code sequences that merges two values using shl and or and then extracts one value using lshr.

Differential Revision: https://reviews.llvm.org/D48828



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338485 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-01 04:40:32 +00:00
David Bolvansky f241788fa5 [InstSimplify] Fold another Select with And/Or pattern
Summary: Proof: https://rise4fun.com/Alive/L5J

Reviewers: lebedev.ri, spatel

Reviewed By: spatel

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D49975

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338383 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-31 14:17:15 +00:00
Hiroshi Inoue 9325cc92ed [InstSimplify] tests for D48828, D49981: fold extraction from std::pair
Minor touch up in the previous comment.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338351 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-31 05:29:20 +00:00
Hiroshi Inoue 24f705031b [InstSimplify] tests for D48828, D49981: fold extraction from std::pair
Updated unit tests for D48828 and D49981.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338350 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-31 05:10:36 +00:00
David Bolvansky 7e678dc65b [InstSimplify] [NFC] Tests for Select with AND/OR fold
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338285 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-30 18:22:18 +00:00
Sanjay Patel 5c9b7b9b82 [InstSimplify] fold funnel shifts with 0-shift amount
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338218 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-29 16:36:38 +00:00
Sanjay Patel c817c924d5 [InstSimplify] add tests for funnel shift intrinsics; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338217 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-29 16:27:17 +00:00
David Bolvansky 6f476979f9 [InstSimplify] Moved Select + AND/OR tests from InstCombine
Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D49957

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338195 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-28 13:52:45 +00:00
Hiroshi Inoue 7eb8348d10 [InstSimplify] tests for D48828: fold extraction from std::pair
This commit includes unit tests for D48828, which enhances InstSimplify to enable jump threading with a method whose return type is std::pair<int, bool> or std::pair<bool, int>.
I am going to commit the actual transformation later.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338107 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-27 07:21:02 +00:00
Chen Zheng ebc7653063 [InstrSimplify] fold sdiv if two operands are negated and non-overflow
Differential Revision: https://reviews.llvm.org/D49382


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337642 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-21 12:27:54 +00:00
Chen Zheng 60fb40346b [NFC][testcases] fold sdiv if two operands are negated and non-overflow
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337549 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-20 13:38:59 +00:00
Chen Zheng da67c6d0ef [InstSimplify] fold srem instruction if its two operands are negated.
Differential Revision: https://reviews.llvm.org/D49423


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337545 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-20 13:00:47 +00:00
Chen Zheng 3876c1deae [NFC][testcases] more testcases for folding srem if its two operands are negatived.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337543 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-20 12:53:45 +00:00
Chen Zheng 1c105a00ab [NFC][testcases] add testcases for folding srem whose operands are negatived.
Finish same optimization for add instruction in D49216 and sdiv instruction in 
D49382. This patch is for srem instruction.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337270 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-17 12:31:54 +00:00
Chen Zheng d13c7c50a3 [testcases] move testcases to right place - NFC
Differential Revision: https://reviews.llvm.org/D49409


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337230 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-17 01:04:41 +00:00
Sanjay Patel 7120b1dbea [InstSimplify] add fixme comment for PR37776; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337129 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-15 16:13:58 +00:00
Sanjay Patel 268055dd8c [InstSimplify] fold minnum/maxnum with NaN arg
This fold is repeated/misplaced in instcombine, but I'm
not sure if it's safe to remove that yet because some
other folds appear to be asserting that the transform
has occurred within instcombine itself.

This isn't the best fix for PR37776, but it probably
hides the bug with the given code example:
https://bugs.llvm.org/show_bug.cgi?id=37776

We have another test to demonstrate the more general bug.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337127 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-15 14:52:16 +00:00
Sanjay Patel 4dd709869f [InstSimplify] add tests for minnum/maxnum; NFC
This isn't the best fix for PR37776, but it probably
hides the bug with the given code example:
https://bugs.llvm.org/show_bug.cgi?id=37776

We have another test to demonstrate the more general
bug.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337126 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-15 14:46:48 +00:00
Chen Zheng 7d5acd8e56 [InstSimplify] simplify add instruction if two operands are negative
Differential Revision: https://reviews.llvm.org/D49216


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336881 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-12 03:06:04 +00:00
Sanjay Patel 67a7a09e83 [InstSimplify] add/move tests for add folds; NFC
isKnownNegation() is currently proposed as part of D48754,
but it could be used to make InstSimplify stronger independently
of any abs() improvements.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336822 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-11 16:52:18 +00:00
Manoj Gupta c6da6867a1 llvm: Add support for "-fno-delete-null-pointer-checks"
Summary:
Support for this option is needed for building Linux kernel.
This is a very frequently requested feature by kernel developers.

More details : https://lkml.org/lkml/2018/4/4/601

GCC option description for -fdelete-null-pointer-checks:
This Assume that programs cannot safely dereference null pointers,
and that no code or data element resides at address zero.

-fno-delete-null-pointer-checks is the inverse of this implying that
null pointer dereferencing is not undefined.

This feature is implemented in LLVM IR in this CL as the function attribute
"null-pointer-is-valid"="true" in IR (Under review at D47894).
The CL updates several passes that assumed null pointer dereferencing is
undefined to not optimize when the "null-pointer-is-valid"="true"
attribute is present.

Reviewers: t.p.northover, efriedma, jyknight, chandlerc, rnk, srhines, void, george.burgess.iv

Reviewed By: efriedma, george.burgess.iv

Subscribers: eraman, haicheng, george.burgess.iv, drinkcat, theraven, reames, sanjoy, xbolva00, llvm-commits

Differential Revision: https://reviews.llvm.org/D47895

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336613 91177308-0d34-0410-b5e6-96231b3b80d8
2018-07-09 22:27:23 +00:00
Sanjay Patel 5f8dac1929 [InstSimplify] fold shifts by sext bool
https://rise4fun.com/Alive/c3Y


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335633 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-26 17:31:38 +00:00
Sanjay Patel 84f6f2281a [InstSimplify] add tests for shifts by sext bool; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335631 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-26 17:15:07 +00:00
Sanjay Patel 7706083ace [InstSimplify] fold srem with sext bool divisor
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335616 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-26 15:32:54 +00:00
Sanjay Patel a301ecd20b [InstSimplify] add tests for srem with sext bool divisor; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335609 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-26 14:47:31 +00:00
Sanjay Patel df0d594dd0 [InstSimplify] fold div/rem of zexted bool
I was looking at an unrelated fold and noticed that
we don't have this simplification (because the other
fold would break existing tests).

Name: zext udiv
  %z = zext i1 %x to i32
  %r = udiv i32 %y, %z
=>
  %r = %y

Name: zext urem
  %z = zext i1 %x to i32
  %r = urem i32 %y, %z
=>
  %r = 0

Name: zext sdiv
  %z = zext i1 %x to i32
  %r = sdiv i32 %y, %z
=>
  %r = %y

Name: zext srem
  %z = zext i1 %x to i32
  %r = srem i32 %y, %z
=>
  %r = 0

https://rise4fun.com/Alive/LZ9


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335512 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-25 18:51:21 +00:00
Sanjay Patel e51396c3ae [InstSimplify] add tests for div/rem with bool divisor; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335509 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-25 18:27:14 +00:00
Sanjay Patel 0da71804c3 [InstSimplify] Fix missed optimization in simplifyUnsignedRangeCheck()
For both operands are unsigned, the following optimizations are valid, and missing:

   1. X > Y && X != 0 --> X > Y
   2. X > Y || X != 0 --> X != 0
   3. X <= Y || X != 0 --> true
   4. X <= Y || X == 0 --> X <= Y
   5. X > Y && X == 0 --> false

unsigned foo(unsigned x, unsigned y) { return x > y && x != 0; }
should fold to x > y, but I found we haven't done it right now.
besides, unsigned foo(unsigned x, unsigned y) { return x < y && y != 0; }
Has been folded to x < y, so there may be a bug.

Patch by: Li Jia He!

Differential Revision: https://reviews.llvm.org/D47922


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335129 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-20 14:22:49 +00:00
Sanjay Patel f4f8a442ba [InstSimplify] Add tests for missed optimizations in simplifyUnsignedRangeCheck (NFC)
These are the baseline tests for the functional change in D47922.

Patch by Li Jia He!

Differential Revision: https://reviews.llvm.org/D48000


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335128 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-20 14:03:13 +00:00
Roman Lebedev b76b2440ec [InstSimplify] add nuw %x, -1 -> -1 fold.
Summary:
`%ret = add nuw i8 %x, C`
From [[ https://llvm.org/docs/LangRef.html#add-instruction | langref ]]:
    nuw and nsw stand for “No Unsigned Wrap” and “No Signed Wrap”,
    respectively. If the nuw and/or nsw keywords are present,
    the result value of the add is a poison value if unsigned
    and/or signed overflow, respectively, occurs.

So if `C` is `-1`, `%x` can only be `0`, and the result is always `-1`.

I'm not sure we want to use `KnownBits`/`LVI` here, because there is
exactly one possible value (all bits set, `-1`), so some other pass
should take care of replacing the known-all-ones with constant `-1`.

The `test/Transforms/InstCombine/set-lowbits-mask-canonicalize.ll` change *is* confusing.
What happening is, before this: (omitting `nuw` for simplicity)
1. First, InstCombine D47428/rL334127 folds `shl i32 1, %NBits`) to `shl nuw i32 -1, %NBits`
2. Then, InstSimplify D47883/rL334222 folds `shl nuw i32 -1, %NBits` to `-1`,
3. `-1` is inverted to `0`.
But now:
1. *This* InstSimplify fold `%ret = add nuw i32 %setbit, -1` -> `-1` happens first,
   before InstCombine D47428/rL334127 fold could happen.
Thus we now end up with the opposite constant,
and it is all good: https://rise4fun.com/Alive/OA9

https://rise4fun.com/Alive/sldC
Was mentioned in D47428 review.
Follow-up for D47883.

Reviewers: spatel, craig.topper

Reviewed By: spatel

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D47908

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334298 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-08 15:44:47 +00:00
Roman Lebedev 6dc64e29f8 [NFC][InstSimplify] Add tests for add nuw %x, -1 -> -1 fold.
%ret = add nuw i8 %x, C
From langref:
	nuw and nsw stand for “No Unsigned Wrap” and “No Signed Wrap”,
	respectively. If the nuw and/or nsw keywords are present,
	the result value of the add is a poison value if unsigned
	and/or signed overflow, respectively, occurs.

So if C is -1, %x can only be 0, and the result is always -1.

https://rise4fun.com/Alive/sldC
Was mentioned in D47428 review.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334236 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-07 21:19:50 +00:00
Roman Lebedev 04cb3cb239 [NFC][InstSimplify] One more negative test for shl nuw C, %x -> C fold.
Follow-up for rL334200, rL334206.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334235 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-07 21:19:45 +00:00
Roman Lebedev fa1dbcce5b [InstSimplify] shl nuw C, %x -> C iff signbit is set on C.
Summary:
`%r = shl nuw i8 C, %x`

As per langref:
```
If the nuw keyword is present, then the shift produces
a poison value if it shifts out any non-zero bits.
```
Thus, if the sign bit is set on `C`, then `%x` can only be `0`,
which means that `%r` can only be `C`.
Or in other words, set sign bit means that the signed value
is negative, so the constant is `<= 0`.

https://rise4fun.com/Alive/WMk
https://rise4fun.com/Alive/udv

Was mentioned in D47428 review.

We already handle the `0` constant, https://godbolt.org/g/UZq1sJ, so this only handles negative constants.

Could use computeKnownBits() / LazyValueInfo,
but the cost-benefit analysis (https://reviews.llvm.org/D47891)
suggests it isn't worth it.

Reviewers: spatel, craig.topper

Reviewed By: spatel

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D47883

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334222 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-07 20:03:45 +00:00
Roman Lebedev afa7b32d8f [NFC][InstSimplify] Add more tests for shl nuw C, %x -> C fold.
Follow-up for rL334200.
For these, KnownBits will be needed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334206 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-07 16:18:26 +00:00
Roman Lebedev 837cf88a09 [NFC][InstSimplify] Add tests for shl nuw C, %x -> C fold.
%r = shl nuw i8 C, %x

As per langref: If the nuw keyword is present, then the shift produces
                a poison value if it shifts out any non-zero bits.
Thus, if the sign bit is set on C, then %x can only be 0,
which means that %r can only be C.

https://rise4fun.com/Alive/WMk
Was mentioned in D47428 review.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334200 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-07 14:18:38 +00:00