120 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4declare double @llvm.fabs.f64(double)5declare float @llvm.fabs.f32(float)6declare <4 x double> @llvm.fabs.v4f64(<4 x double>)7declare void @use(double)8 9declare double @llvm.copysign.f64(double, double)10declare float @llvm.copysign.f32(float, float)11 12define double @fabs_copysign(double %x) {13; CHECK-LABEL: @fabs_copysign(14; CHECK-NEXT: [[DIV:%.*]] = call nnan ninf double @llvm.copysign.f64(double 1.000000e+00, double [[X:%.*]])15; CHECK-NEXT: ret double [[DIV]]16;17 %f = tail call double @llvm.fabs.f64(double %x)18 %div = fdiv nnan ninf double %x, %f19 ret double %div20}21 22define double @fabs_copysign_commuted(double %x) {23; CHECK-LABEL: @fabs_copysign_commuted(24; CHECK-NEXT: [[DIV:%.*]] = call nnan ninf double @llvm.copysign.f64(double 1.000000e+00, double [[X:%.*]])25; CHECK-NEXT: ret double [[DIV]]26;27 %f = tail call double @llvm.fabs.f64(double %x)28 %div = fdiv nnan ninf double %f, %x29 ret double %div30}31 32define <4 x double> @fabs_copysign_vec(<4 x double> %x) {33; CHECK-LABEL: @fabs_copysign_vec(34; CHECK-NEXT: [[DIV:%.*]] = call nnan ninf <4 x double> @llvm.copysign.v4f64(<4 x double> splat (double 1.000000e+00), <4 x double> [[X:%.*]])35; CHECK-NEXT: ret <4 x double> [[DIV]]36;37 %f = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)38 %div = fdiv nnan ninf <4 x double> %x, %f39 ret <4 x double> %div40}41 42define <4 x double> @fabs_copysign_vec_commuted(<4 x double> %x) {43; CHECK-LABEL: @fabs_copysign_vec_commuted(44; CHECK-NEXT: [[DIV:%.*]] = call nnan ninf <4 x double> @llvm.copysign.v4f64(<4 x double> splat (double 1.000000e+00), <4 x double> [[X:%.*]])45; CHECK-NEXT: ret <4 x double> [[DIV]]46;47 %f = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)48 %div = fdiv nnan ninf <4 x double> %f, %x49 ret <4 x double> %div50}51 52define float @fabs_copysignf(float %x) {53; CHECK-LABEL: @fabs_copysignf(54; CHECK-NEXT: [[DIV:%.*]] = call nnan ninf float @llvm.copysign.f32(float 1.000000e+00, float [[X:%.*]])55; CHECK-NEXT: ret float [[DIV]]56;57 %f = tail call float @llvm.fabs.f32(float %x)58 %div = fdiv nnan ninf float %x, %f59 ret float %div60}61 62define double @fabs_copysign_use(double %x) {63; CHECK-LABEL: @fabs_copysign_use(64; CHECK-NEXT: [[F:%.*]] = tail call double @llvm.fabs.f64(double [[X:%.*]])65; CHECK-NEXT: call void @use(double [[F]])66; CHECK-NEXT: [[DIV:%.*]] = call nnan ninf double @llvm.copysign.f64(double 1.000000e+00, double [[X]])67; CHECK-NEXT: ret double [[DIV]]68;69 %f = tail call double @llvm.fabs.f64(double %x)70 call void @use(double %f)71 %div = fdiv nnan ninf double %x, %f72 ret double %div73}74 75; Negative tests76 77define double @fabs_copysign_mismatch(double %x, double %y) {78; CHECK-LABEL: @fabs_copysign_mismatch(79; CHECK-NEXT: [[F:%.*]] = tail call double @llvm.fabs.f64(double [[Y:%.*]])80; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[F]]81; CHECK-NEXT: ret double [[DIV]]82;83 %f = tail call double @llvm.fabs.f64(double %y)84 %div = fdiv double %x, %f85 ret double %div86}87 88define double @fabs_copysign_commuted_mismatch(double %x, double %y) {89; CHECK-LABEL: @fabs_copysign_commuted_mismatch(90; CHECK-NEXT: [[F:%.*]] = tail call double @llvm.fabs.f64(double [[Y:%.*]])91; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[F]], [[X:%.*]]92; CHECK-NEXT: ret double [[DIV]]93;94 %f = tail call double @llvm.fabs.f64(double %y)95 %div = fdiv double %f, %x96 ret double %div97}98 99define double @fabs_copysign_no_nnan(double %x) {100; CHECK-LABEL: @fabs_copysign_no_nnan(101; CHECK-NEXT: [[F:%.*]] = tail call double @llvm.fabs.f64(double [[X:%.*]])102; CHECK-NEXT: [[DIV:%.*]] = fdiv ninf double [[X]], [[F]]103; CHECK-NEXT: ret double [[DIV]]104;105 %f = tail call double @llvm.fabs.f64(double %x)106 %div = fdiv ninf double %x, %f107 ret double %div108}109 110define double @fabs_copysign_no_ninf(double %x) {111; CHECK-LABEL: @fabs_copysign_no_ninf(112; CHECK-NEXT: [[F:%.*]] = tail call double @llvm.fabs.f64(double [[X:%.*]])113; CHECK-NEXT: [[DIV:%.*]] = fdiv nnan double [[X]], [[F]]114; CHECK-NEXT: ret double [[DIV]]115;116 %f = tail call double @llvm.fabs.f64(double %x)117 %div = fdiv nnan double %x, %f118 ret double %div119}120