blob: 24088910e313b3b538be08d8abdc39685058c0c1 [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S -passes=attributor -attributor-manifest-internal < %s | FileCheck %s
declare double @llvm.amdgcn.fract.f64(double) #0
define double @ret_fract(double %x) {
; CHECK-LABEL: define nofpclass(inf) double @ret_fract(
; CHECK-SAME: double [[X:%.*]]) #[[ATTR1:[0-9]+]] {
; CHECK-NEXT: [[FRACT:%.*]] = call nofpclass(inf) double @llvm.amdgcn.fract.f64(double [[X]]) #[[ATTR2:[0-9]+]]
; CHECK-NEXT: ret double [[FRACT]]
;
%fract = call double @llvm.amdgcn.fract.f64(double %x)
ret double %fract
}
define double @ret_fract_no_qnan(double nofpclass(qnan) %x) {
; CHECK-LABEL: define nofpclass(inf) double @ret_fract_no_qnan(
; CHECK-SAME: double nofpclass(qnan) [[X:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[FRACT:%.*]] = call nofpclass(inf) double @llvm.amdgcn.fract.f64(double nofpclass(qnan) [[X]]) #[[ATTR2]]
; CHECK-NEXT: ret double [[FRACT]]
;
%fract = call double @llvm.amdgcn.fract.f64(double %x)
ret double %fract
}
define double @ret_fract_no_snan(double nofpclass(snan) %x) {
; CHECK-LABEL: define nofpclass(snan inf) double @ret_fract_no_snan(
; CHECK-SAME: double nofpclass(snan) [[X:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[FRACT:%.*]] = call nofpclass(snan inf) double @llvm.amdgcn.fract.f64(double nofpclass(snan) [[X]]) #[[ATTR2]]
; CHECK-NEXT: ret double [[FRACT]]
;
%fract = call double @llvm.amdgcn.fract.f64(double %x)
ret double %fract
}
define double @ret_fract_no_inf(double nofpclass(inf) %x) {
; CHECK-LABEL: define nofpclass(inf) double @ret_fract_no_inf(
; CHECK-SAME: double nofpclass(inf) [[X:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[FRACT:%.*]] = call nofpclass(inf) double @llvm.amdgcn.fract.f64(double nofpclass(inf) [[X]]) #[[ATTR2]]
; CHECK-NEXT: ret double [[FRACT]]
;
%fract = call double @llvm.amdgcn.fract.f64(double %x)
ret double %fract
}
define double @ret_fract_no_nan(double nofpclass(nan) %x) {
; CHECK-LABEL: define nofpclass(snan inf) double @ret_fract_no_nan(
; CHECK-SAME: double nofpclass(nan) [[X:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[FRACT:%.*]] = call nofpclass(snan inf) double @llvm.amdgcn.fract.f64(double nofpclass(nan) [[X]]) #[[ATTR2]]
; CHECK-NEXT: ret double [[FRACT]]
;
%fract = call double @llvm.amdgcn.fract.f64(double %x)
ret double %fract
}
define double @ret_fract_no_nan_no_inf(double nofpclass(inf nan) %x) {
; CHECK-LABEL: define nofpclass(nan inf) double @ret_fract_no_nan_no_inf(
; CHECK-SAME: double nofpclass(nan inf) [[X:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[FRACT:%.*]] = call nofpclass(nan inf) double @llvm.amdgcn.fract.f64(double nofpclass(nan inf) [[X]]) #[[ATTR2]]
; CHECK-NEXT: ret double [[FRACT]]
;
%fract = call double @llvm.amdgcn.fract.f64(double %x)
ret double %fract
}
; Fract must be < 1, so this cannot introduce overflow
define float @ret_not_inf__fmul__fract(float nofpclass(inf) %not.inf, float %x) {
; CHECK-LABEL: define nofpclass(inf) float @ret_not_inf__fmul__fract(
; CHECK-SAME: float nofpclass(inf) [[NOT_INF:%.*]], float [[X:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[FRACT:%.*]] = call float @llvm.amdgcn.fract.f32(float [[X]]) #[[ATTR2]]
; CHECK-NEXT: [[MUL:%.*]] = fmul float [[NOT_INF]], [[FRACT]]
; CHECK-NEXT: ret float [[MUL]]
;
%fract = call float @llvm.amdgcn.fract.f32(float %x)
%mul = fmul float %not.inf, %fract
ret float %mul
}
; Commuted
define float @ret_fract__fmul__not_inf(float nofpclass(inf) %not.inf, float %x) {
; CHECK-LABEL: define nofpclass(inf) float @ret_fract__fmul__not_inf(
; CHECK-SAME: float nofpclass(inf) [[NOT_INF:%.*]], float [[X:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[FRACT:%.*]] = call float @llvm.amdgcn.fract.f32(float [[X]]) #[[ATTR2]]
; CHECK-NEXT: [[MUL:%.*]] = fmul float [[FRACT]], [[NOT_INF]]
; CHECK-NEXT: ret float [[MUL]]
;
%fract = call float @llvm.amdgcn.fract.f32(float %x)
%mul = fmul float %fract, %not.inf
ret float %mul
}
attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }