[InstSimplify] Add test case to show bad sign bit handling for integer abs idiom in computeKnownBits.

computeKnownBits will indicate the sign bit of abs is 0 if the
the RHS operand returned by matchSelectPattern has the nsw flag set.
For abs idioms like (X >= 0) ? X : -X, the RHS returns -X. But
we can also match ((X-Y) >= 0 ? X-Y : Y-X as abs. In this case
RHS will be the Y-X operand. According to Alive, the sign bit for
this is only 0 if both the X-Y and Y-X operands have the nsw flag.
But we're only checking the Y-X operand.

llvm-svn: 367747
This commit is contained in:
Craig Topper 2019-08-03 02:54:54 +00:00
parent 67e93a1ae0
commit aa2810b6e7
1 changed files with 12 additions and 0 deletions

View File

@ -401,3 +401,15 @@ define i1 @nabs_no_intersection(i32 %a) {
ret i1 %r
}
; We can't fold this to false unless both subs have nsw.
define i1 @abs_sub_sub_missing_nsw(i32 %x, i32 %y) {
; CHECK-LABEL: @abs_sub_sub_missing_nsw(
; CHECK-NEXT: ret i1 false
;
%a = sub i32 %x, %y
%b = sub nsw i32 %y, %x
%c = icmp sgt i32 %a, -1
%d = select i1 %c, i32 %a, i32 %b
%e = icmp slt i32 %d, 0
ret i1 %e
}