| ; 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) } |