1486ed885SArthur Eubanks; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*b280ee1dSBjorn Pettersson; RUN: opt -passes=instsimplify -S < %s | FileCheck %s 3486ed885SArthur Eubanks 4486ed885SArthur Eubanks; Fixes PR20832 5486ed885SArthur Eubanks; Make sure that we correctly fold a fused multiply-add where operands 6486ed885SArthur Eubanks; are all finite constants and addend is zero. 7486ed885SArthur Eubanks 8486ed885SArthur Eubanksdeclare double @llvm.fma.f64(double, double, double) 9486ed885SArthur Eubanks 10486ed885SArthur Eubanks 11486ed885SArthur Eubanksdefine double @PR20832() { 12486ed885SArthur Eubanks; CHECK-LABEL: @PR20832( 13486ed885SArthur Eubanks; CHECK-NEXT: ret double 5.600000e+01 14486ed885SArthur Eubanks; 15486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0.0) 16486ed885SArthur Eubanks ret double %1 17486ed885SArthur Eubanks} 18486ed885SArthur Eubanks 19486ed885SArthur Eubanks; Test builtin fma with all finite non-zero constants. 20486ed885SArthur Eubanksdefine double @test_all_finite() { 21486ed885SArthur Eubanks; CHECK-LABEL: @test_all_finite( 22486ed885SArthur Eubanks; CHECK-NEXT: ret double 6.100000e+01 23486ed885SArthur Eubanks; 24486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 5.0) 25486ed885SArthur Eubanks ret double %1 26486ed885SArthur Eubanks} 27486ed885SArthur Eubanks 28486ed885SArthur Eubanks; Test builtin fma with a +/-NaN addend. 29486ed885SArthur Eubanksdefine double @test_NaN_addend() { 30486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_addend( 31486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 32486ed885SArthur Eubanks; 33486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0x7FF8000000000000) 34486ed885SArthur Eubanks ret double %1 35486ed885SArthur Eubanks} 36486ed885SArthur Eubanks 37486ed885SArthur Eubanksdefine double @test_NaN_addend_2() { 38486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_addend_2( 39486ed885SArthur Eubanks; CHECK-NEXT: ret double 0xFFF8000000000000 40486ed885SArthur Eubanks; 41486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0xFFF8000000000000) 42486ed885SArthur Eubanks ret double %1 43486ed885SArthur Eubanks} 44486ed885SArthur Eubanks 45486ed885SArthur Eubanks; Test builtin fma with a +/-Inf addend. 46486ed885SArthur Eubanksdefine double @test_Inf_addend() { 47486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_addend( 48486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF0000000000000 49486ed885SArthur Eubanks; 50486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0x7FF0000000000000) 51486ed885SArthur Eubanks ret double %1 52486ed885SArthur Eubanks} 53486ed885SArthur Eubanks 54486ed885SArthur Eubanksdefine double @test_Inf_addend_2() { 55486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_addend_2( 56486ed885SArthur Eubanks; CHECK-NEXT: ret double 0xFFF0000000000000 57486ed885SArthur Eubanks; 58486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0xFFF0000000000000) 59486ed885SArthur Eubanks ret double %1 60486ed885SArthur Eubanks} 61486ed885SArthur Eubanks 62486ed885SArthur Eubanks; Test builtin fma with one of the operands to the multiply being +/-NaN. 63486ed885SArthur Eubanksdefine double @test_NaN_1() { 64486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_1( 65486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 66486ed885SArthur Eubanks; 67486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0x7FF8000000000000, double 8.0, double 0.0) 68486ed885SArthur Eubanks ret double %1 69486ed885SArthur Eubanks} 70486ed885SArthur Eubanks 71486ed885SArthur Eubanksdefine double @test_NaN_2() { 72486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_2( 73486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 74486ed885SArthur Eubanks; 75486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF8000000000000, double 0.0) 76486ed885SArthur Eubanks ret double %1 77486ed885SArthur Eubanks} 78486ed885SArthur Eubanks 79486ed885SArthur Eubanksdefine double @test_NaN_3() { 80486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_3( 81486ed885SArthur Eubanks; CHECK-NEXT: ret double 0xFFF8000000000000 82486ed885SArthur Eubanks; 83486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0xFFF8000000000000, double 8.0, double 0.0) 84486ed885SArthur Eubanks ret double %1 85486ed885SArthur Eubanks} 86486ed885SArthur Eubanks 87486ed885SArthur Eubanksdefine double @test_NaN_4() { 88486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_4( 89486ed885SArthur Eubanks; CHECK-NEXT: ret double 0xFFF8000000000000 90486ed885SArthur Eubanks; 91486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF8000000000000, double 0.0) 92486ed885SArthur Eubanks ret double %1 93486ed885SArthur Eubanks} 94486ed885SArthur Eubanks 95486ed885SArthur Eubanks; Test builtin fma with one of the operands to the multiply being +/-Inf. 96486ed885SArthur Eubanksdefine double @test_Inf_1() { 97486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_1( 98486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF0000000000000 99486ed885SArthur Eubanks; 100486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 8.0, double 0.0) 101486ed885SArthur Eubanks ret double %1 102486ed885SArthur Eubanks} 103486ed885SArthur Eubanks 104486ed885SArthur Eubanksdefine double @test_Inf_2() { 105486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_2( 106486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF0000000000000 107486ed885SArthur Eubanks; 108486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF0000000000000, double 0.0) 109486ed885SArthur Eubanks ret double %1 110486ed885SArthur Eubanks} 111486ed885SArthur Eubanks 112486ed885SArthur Eubanksdefine double @test_Inf_3() { 113486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_3( 114486ed885SArthur Eubanks; CHECK-NEXT: ret double 0xFFF0000000000000 115486ed885SArthur Eubanks; 116486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 8.0, double 0.0) 117486ed885SArthur Eubanks ret double %1 118486ed885SArthur Eubanks} 119486ed885SArthur Eubanks 120486ed885SArthur Eubanksdefine double @test_Inf_4() { 121486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_4( 122486ed885SArthur Eubanks; CHECK-NEXT: ret double 0xFFF0000000000000 123486ed885SArthur Eubanks; 124486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF0000000000000, double 0.0) 125486ed885SArthur Eubanks ret double %1 126486ed885SArthur Eubanks} 127486ed885SArthur Eubanks 128486ed885SArthur Eubanks; -inf + inf --> NaN 129486ed885SArthur Eubanks 130486ed885SArthur Eubanksdefine double @inf_product_opposite_inf_addend_1() { 131486ed885SArthur Eubanks; CHECK-LABEL: @inf_product_opposite_inf_addend_1( 132486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 133486ed885SArthur Eubanks; 134486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF0000000000000, double 0x7FF0000000000000) 135486ed885SArthur Eubanks ret double %1 136486ed885SArthur Eubanks} 137486ed885SArthur Eubanks 138486ed885SArthur Eubanks; inf + -inf --> NaN 139486ed885SArthur Eubanks 140486ed885SArthur Eubanksdefine double @inf_product_opposite_inf_addend_2() { 141486ed885SArthur Eubanks; CHECK-LABEL: @inf_product_opposite_inf_addend_2( 142486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 143486ed885SArthur Eubanks; 144486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF0000000000000, double 0xFFF0000000000000) 145486ed885SArthur Eubanks ret double %1 146486ed885SArthur Eubanks} 147486ed885SArthur Eubanks 148486ed885SArthur Eubanks; -inf + inf --> NaN 149486ed885SArthur Eubanks 150486ed885SArthur Eubanksdefine double @inf_product_opposite_inf_addend_3() { 151486ed885SArthur Eubanks; CHECK-LABEL: @inf_product_opposite_inf_addend_3( 152486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 153486ed885SArthur Eubanks; 154486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 42.0, double 0x7FF0000000000000) 155486ed885SArthur Eubanks ret double %1 156486ed885SArthur Eubanks} 157486ed885SArthur Eubanks 158486ed885SArthur Eubanks; inf + -inf --> NaN 159486ed885SArthur Eubanks 160486ed885SArthur Eubanksdefine double @inf_product_opposite_inf_addend_4() { 161486ed885SArthur Eubanks; CHECK-LABEL: @inf_product_opposite_inf_addend_4( 162486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 163486ed885SArthur Eubanks; 164486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 42.0, double 0xFFF0000000000000) 165486ed885SArthur Eubanks ret double %1 166486ed885SArthur Eubanks} 167486ed885SArthur Eubanks 168486ed885SArthur Eubanks; 0 * -inf --> NaN 169486ed885SArthur Eubanks 170486ed885SArthur Eubanksdefine double @inf_times_zero_1() { 171486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_1( 172486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 173486ed885SArthur Eubanks; 174486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0.0, double 0xFFF0000000000000, double 42.0) 175486ed885SArthur Eubanks ret double %1 176486ed885SArthur Eubanks} 177486ed885SArthur Eubanks 178486ed885SArthur Eubanks; 0 * inf --> NaN 179486ed885SArthur Eubanks 180486ed885SArthur Eubanksdefine double @inf_times_zero_2() { 181486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_2( 182486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 183486ed885SArthur Eubanks; 184486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0.0, double 0x7FF0000000000000, double 42.0) 185486ed885SArthur Eubanks ret double %1 186486ed885SArthur Eubanks} 187486ed885SArthur Eubanks 188486ed885SArthur Eubanks; -inf * 0 --> NaN 189486ed885SArthur Eubanks 190486ed885SArthur Eubanksdefine double @inf_times_zero_3() { 191486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_3( 192486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 193486ed885SArthur Eubanks; 194486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 0.0, double 42.0) 195486ed885SArthur Eubanks ret double %1 196486ed885SArthur Eubanks} 197486ed885SArthur Eubanks 198486ed885SArthur Eubanks; inf * 0 --> NaN 199486ed885SArthur Eubanks 200486ed885SArthur Eubanksdefine double @inf_times_zero_4() { 201486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_4( 202486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 203486ed885SArthur Eubanks; 204486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 0.0, double 42.0) 205486ed885SArthur Eubanks ret double %1 206486ed885SArthur Eubanks} 207486ed885SArthur Eubanks 208486ed885SArthur Eubanks; -0 * -inf --> NaN 209486ed885SArthur Eubanks 210486ed885SArthur Eubanksdefine double @inf_times_zero_5() { 211486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_5( 212486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 213486ed885SArthur Eubanks; 214486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double -0.0, double 0xFFF0000000000000, double 42.0) 215486ed885SArthur Eubanks ret double %1 216486ed885SArthur Eubanks} 217486ed885SArthur Eubanks 218486ed885SArthur Eubanks; -0 * inf --> NaN 219486ed885SArthur Eubanks 220486ed885SArthur Eubanksdefine double @inf_times_zero_6() { 221486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_6( 222486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 223486ed885SArthur Eubanks; 224486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double -0.0, double 0x7FF0000000000000, double 42.0) 225486ed885SArthur Eubanks ret double %1 226486ed885SArthur Eubanks} 227486ed885SArthur Eubanks 228486ed885SArthur Eubanks; -inf * -0 --> NaN 229486ed885SArthur Eubanks 230486ed885SArthur Eubanksdefine double @inf_times_zero_7() { 231486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_7( 232486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 233486ed885SArthur Eubanks; 234486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double -0.0, double 42.0) 235486ed885SArthur Eubanks ret double %1 236486ed885SArthur Eubanks} 237486ed885SArthur Eubanks 238486ed885SArthur Eubanks; inf * -0 --> NaN 239486ed885SArthur Eubanks 240486ed885SArthur Eubanksdefine double @inf_times_zero_8() { 241486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_8( 242486ed885SArthur Eubanks; CHECK-NEXT: ret double 0x7FF8000000000000 243486ed885SArthur Eubanks; 244486ed885SArthur Eubanks %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double -0.0, double 42.0) 245486ed885SArthur Eubanks ret double %1 246486ed885SArthur Eubanks} 247