1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define float @remquo_f32(ptr %quo) { 5; CHECK-LABEL: define float @remquo_f32( 6; CHECK-SAME: ptr [[QUO:%.*]]) { 7; CHECK-NEXT: [[ENTRY:.*:]] 8; CHECK-NEXT: store i32 -2, ptr [[QUO]], align 4 9; CHECK-NEXT: ret float 1.000000e+00 10; 11entry: 12 %call = call float @remquof(float -5.000000e+00, float 3.000000e+00, ptr %quo) 13 ret float %call 14} 15 16define float @remquo_f32_quo_sign(ptr %quo) { 17; CHECK-LABEL: define float @remquo_f32_quo_sign( 18; CHECK-SAME: ptr [[QUO:%.*]]) { 19; CHECK-NEXT: [[ENTRY:.*:]] 20; CHECK-NEXT: store i32 2, ptr [[QUO]], align 4 21; CHECK-NEXT: ret float -1.000000e+00 22; 23entry: 24 %call = call float @remquof(float 5.000000e+00, float 3.000000e+00, ptr %quo) 25 ret float %call 26} 27 28define float @remquo_f32_round(ptr %quo) { 29; CHECK-LABEL: define float @remquo_f32_round( 30; CHECK-SAME: ptr [[QUO:%.*]]) { 31; CHECK-NEXT: [[ENTRY:.*:]] 32; CHECK-NEXT: store i32 -6, ptr [[QUO]], align 4 33; CHECK-NEXT: ret float 0xBFC9999900000000 34; 35entry: 36 %call = call float @remquof(float -5.000000e+00, float 0x3FE99999A0000000, ptr %quo) 37 ret float %call 38} 39 40define double @remquo_f64(ptr %quo) { 41; CHECK-LABEL: define double @remquo_f64( 42; CHECK-SAME: ptr [[QUO:%.*]]) { 43; CHECK-NEXT: [[ENTRY:.*:]] 44; CHECK-NEXT: store i32 -5, ptr [[QUO]], align 4 45; CHECK-NEXT: ret double -0.000000e+00 46; 47entry: 48 %call = call double @remquo(double -5.000000e+00, double 1.000000e+00, ptr %quo) 49 ret double %call 50} 51 52; Negative tests 53 54define float @remquo_f32_inf_x(ptr %quo) { 55; CHECK-LABEL: define float @remquo_f32_inf_x( 56; CHECK-SAME: ptr [[QUO:%.*]]) { 57; CHECK-NEXT: [[ENTRY:.*:]] 58; CHECK-NEXT: [[CALL:%.*]] = call float @remquof(float 0x7FF0000000000000, float 1.000000e+00, ptr [[QUO]]) 59; CHECK-NEXT: ret float [[CALL]] 60; 61entry: 62 %call = call float @remquof(float 0x7FF0000000000000, float 1.000000e+00, ptr %quo) 63 ret float %call 64} 65 66define float @remquo_f32_zero_y(ptr %quo) { 67; CHECK-LABEL: define float @remquo_f32_zero_y( 68; CHECK-SAME: ptr [[QUO:%.*]]) { 69; CHECK-NEXT: [[ENTRY:.*:]] 70; CHECK-NEXT: [[CALL:%.*]] = call float @remquof(float -5.000000e+00, float 0.000000e+00, ptr [[QUO]]) 71; CHECK-NEXT: ret float [[CALL]] 72; 73entry: 74 %call = call float @remquof(float -5.000000e+00, float 0.000000e+00, ptr %quo) 75 ret float %call 76} 77 78define float @remquo_f32_nzero_y(ptr %quo) { 79; CHECK-LABEL: define float @remquo_f32_nzero_y( 80; CHECK-SAME: ptr [[QUO:%.*]]) { 81; CHECK-NEXT: [[ENTRY:.*:]] 82; CHECK-NEXT: [[CALL:%.*]] = call float @remquof(float -5.000000e+00, float -0.000000e+00, ptr [[QUO]]) 83; CHECK-NEXT: ret float [[CALL]] 84; 85entry: 86 %call = call float @remquof(float -5.000000e+00, float -0.000000e+00, ptr %quo) 87 ret float %call 88} 89 90define float @remquo_f32_nan_x(ptr %quo) { 91; CHECK-LABEL: define float @remquo_f32_nan_x( 92; CHECK-SAME: ptr [[QUO:%.*]]) { 93; CHECK-NEXT: [[ENTRY:.*:]] 94; CHECK-NEXT: [[CALL:%.*]] = call float @remquof(float 0x7FF8000000000000, float 1.000000e+00, ptr [[QUO]]) 95; CHECK-NEXT: ret float [[CALL]] 96; 97entry: 98 %call = call float @remquof(float 0x7FF8000000000000, float 1.000000e+00, ptr %quo) 99 ret float %call 100} 101 102define float @remquo_f32_nan_y(ptr %quo) { 103; CHECK-LABEL: define float @remquo_f32_nan_y( 104; CHECK-SAME: ptr [[QUO:%.*]]) { 105; CHECK-NEXT: [[ENTRY:.*:]] 106; CHECK-NEXT: [[CALL:%.*]] = call float @remquof(float 1.000000e+00, float 0x7FF8000000000000, ptr [[QUO]]) 107; CHECK-NEXT: ret float [[CALL]] 108; 109entry: 110 %call = call float @remquof(float 1.000000e+00, float 0x7FF8000000000000, ptr %quo) 111 ret float %call 112} 113 114define float @remquo_f32_strictfp(ptr %quo) strictfp { 115; CHECK-LABEL: define float @remquo_f32_strictfp( 116; CHECK-SAME: ptr [[QUO:%.*]]) #[[ATTR0:[0-9]+]] { 117; CHECK-NEXT: [[ENTRY:.*:]] 118; CHECK-NEXT: [[CALL:%.*]] = call float @remquof(float -5.000000e+00, float 3.000000e+00, ptr [[QUO]]) #[[ATTR0]] 119; CHECK-NEXT: ret float [[CALL]] 120; 121entry: 122 %call = call float @remquof(float -5.000000e+00, float 3.000000e+00, ptr %quo) strictfp 123 ret float %call 124} 125 126define float @remquo_f32_zero_y_strictfp(ptr %quo) strictfp { 127; CHECK-LABEL: define float @remquo_f32_zero_y_strictfp( 128; CHECK-SAME: ptr [[QUO:%.*]]) #[[ATTR0]] { 129; CHECK-NEXT: [[ENTRY:.*:]] 130; CHECK-NEXT: [[CALL:%.*]] = call float @remquof(float -5.000000e+00, float 0.000000e+00, ptr [[QUO]]) #[[ATTR0]] 131; CHECK-NEXT: ret float [[CALL]] 132; 133entry: 134 %call = call float @remquof(float -5.000000e+00, float 0.000000e+00, ptr %quo) strictfp 135 ret float %call 136} 137 138declare float @remquof(float, float, ptr) 139declare double @remquo(double, double, ptr) 140