
In https://github.com/llvm/llvm-project/pull/97762, we assume the minimum possible value of X is NaN implies X is NaN. But it doesn't hold for x86_fp80 format. If the knownbits of X are `?'011111111111110'????????????????????????????????????????????????????????????????`, the minimum possible value of X is NaN/unnormal. However, it can be a normal value. Closes https://github.com/llvm/llvm-project/issues/130408.
36 lines
1.1 KiB
LLVM
36 lines
1.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
|
|
|
|
define i1 @poison(float %x) {
|
|
; CHECK-LABEL: @poison(
|
|
; CHECK-NEXT: ret i1 poison
|
|
;
|
|
%v = fcmp oeq float %x, poison
|
|
ret i1 %v
|
|
}
|
|
|
|
define i1 @poison2(float %x) {
|
|
; CHECK-LABEL: @poison2(
|
|
; CHECK-NEXT: ret i1 poison
|
|
;
|
|
%v = fcmp ueq float %x, poison
|
|
ret i1 %v
|
|
}
|
|
|
|
define i1 @pr130408(x86_fp80 %x) {
|
|
; CHECK-LABEL: @pr130408(
|
|
; CHECK-NEXT: [[BITS:%.*]] = bitcast x86_fp80 [[X:%.*]] to i80
|
|
; CHECK-NEXT: [[MASKED:%.*]] = and i80 [[BITS]], -604444463063240877801473
|
|
; CHECK-NEXT: [[OR:%.*]] = or i80 [[MASKED]], 302194561415509874573312
|
|
; CHECK-NEXT: [[FP:%.*]] = bitcast i80 [[OR]] to x86_fp80
|
|
; CHECK-NEXT: [[RES:%.*]] = fcmp uno x86_fp80 [[FP]], 0xK00000000000000000000
|
|
; CHECK-NEXT: ret i1 [[RES]]
|
|
;
|
|
%bits = bitcast x86_fp80 %x to i80
|
|
%masked = and i80 %bits, -604444463063240877801473
|
|
%or = or i80 %masked, 302194561415509874573312
|
|
%fp = bitcast i80 %or to x86_fp80
|
|
%res = fcmp uno x86_fp80 %fp, 0xK00000000000000000000
|
|
ret i1 %res
|
|
}
|