1*8148c28fSSanjay Patel; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2b280ee1dSBjorn Pettersson; RUN: opt -passes=instsimplify -S < %s | FileCheck %s 3486ed885SArthur Eubanks 4486ed885SArthur Eubanks; Verify that we don't crash with an assertion failure when constant folding 5486ed885SArthur Eubanks; a call to intrinsic 'convert.from.fp16' if the return type is not 'float'. 6486ed885SArthur Eubanks 7486ed885SArthur Eubanksdefine float @fold_from_fp16_to_fp32() { 8*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_fp32( 9*8148c28fSSanjay Patel; CHECK-NEXT: ret float 0.000000e+00 10*8148c28fSSanjay Patel; 11*8148c28fSSanjay Patel %r = call float @llvm.convert.from.fp16.f32(i16 0) 12*8148c28fSSanjay Patel ret float %r 13486ed885SArthur Eubanks} 14486ed885SArthur Eubanks 15486ed885SArthur Eubanksdefine double @fold_from_fp16_to_fp64() { 16*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_fp64( 17*8148c28fSSanjay Patel; CHECK-NEXT: ret double 0.000000e+00 18*8148c28fSSanjay Patel; 19*8148c28fSSanjay Patel %r = call double @llvm.convert.from.fp16.f64(i16 0) 20*8148c28fSSanjay Patel ret double %r 21486ed885SArthur Eubanks} 22486ed885SArthur Eubanks 23486ed885SArthur Eubanksdefine x86_fp80 @fold_from_fp16_to_fp80() { 24*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_fp80( 25*8148c28fSSanjay Patel; CHECK-NEXT: ret x86_fp80 0xK00000000000000000000 26*8148c28fSSanjay Patel; 27*8148c28fSSanjay Patel %r = call x86_fp80 @llvm.convert.from.fp16.f80(i16 0) 28*8148c28fSSanjay Patel ret x86_fp80 %r 29486ed885SArthur Eubanks} 30486ed885SArthur Eubanks 31486ed885SArthur Eubanksdefine fp128 @fold_from_fp16_to_fp128() { 32*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_fp128( 33*8148c28fSSanjay Patel; CHECK-NEXT: ret fp128 0xL00000000000000000000000000000000 34*8148c28fSSanjay Patel; 35*8148c28fSSanjay Patel %r = call fp128 @llvm.convert.from.fp16.f128(i16 0) 36*8148c28fSSanjay Patel ret fp128 %r 37486ed885SArthur Eubanks} 38486ed885SArthur Eubanks 39486ed885SArthur Eubanksdefine ppc_fp128 @fold_from_fp16_to_ppcfp128() { 40*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_ppcfp128( 41*8148c28fSSanjay Patel; CHECK-NEXT: ret ppc_fp128 0xM00000000000000000000000000000000 42*8148c28fSSanjay Patel; 43*8148c28fSSanjay Patel %r = call ppc_fp128 @llvm.convert.from.fp16.ppcf128(i16 0) 44*8148c28fSSanjay Patel ret ppc_fp128 %r 45486ed885SArthur Eubanks} 46486ed885SArthur Eubanks 47486ed885SArthur Eubanksdefine float @fold_from_fp16_to_fp32_b() { 48*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_fp32_b( 49*8148c28fSSanjay Patel; CHECK-NEXT: ret float 4.000000e+00 50*8148c28fSSanjay Patel; 51*8148c28fSSanjay Patel %a = call i16 @llvm.convert.to.fp16.f64(double 4.0) 52*8148c28fSSanjay Patel %r = call float @llvm.convert.from.fp16.f32(i16 %a) 53*8148c28fSSanjay Patel ret float %r 54486ed885SArthur Eubanks} 55486ed885SArthur Eubanks 56486ed885SArthur Eubanksdefine double @fold_from_fp16_to_fp64_b() { 57*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_fp64_b( 58*8148c28fSSanjay Patel; CHECK-NEXT: ret double 4.000000e+00 59*8148c28fSSanjay Patel; 60*8148c28fSSanjay Patel %a = call i16 @llvm.convert.to.fp16.f64(double 4.0) 61*8148c28fSSanjay Patel %r = call double @llvm.convert.from.fp16.f64(i16 %a) 62*8148c28fSSanjay Patel ret double %r 63486ed885SArthur Eubanks} 64486ed885SArthur Eubanks 65486ed885SArthur Eubanksdefine x86_fp80 @fold_from_fp16_to_fp80_b() { 66*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_fp80_b( 67*8148c28fSSanjay Patel; CHECK-NEXT: ret x86_fp80 0xK40018000000000000000 68*8148c28fSSanjay Patel; 69*8148c28fSSanjay Patel %a = call i16 @llvm.convert.to.fp16.f64(double 4.0) 70*8148c28fSSanjay Patel %r = call x86_fp80 @llvm.convert.from.fp16.f80(i16 %a) 71*8148c28fSSanjay Patel ret x86_fp80 %r 72486ed885SArthur Eubanks} 73486ed885SArthur Eubanks 74486ed885SArthur Eubanksdefine fp128 @fold_from_fp16_to_fp128_b() { 75*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_fp128_b( 76*8148c28fSSanjay Patel; CHECK-NEXT: ret fp128 0xL00000000000000004001000000000000 77*8148c28fSSanjay Patel; 78*8148c28fSSanjay Patel %a = call i16 @llvm.convert.to.fp16.f64(double 4.0) 79*8148c28fSSanjay Patel %r = call fp128 @llvm.convert.from.fp16.f128(i16 %a) 80*8148c28fSSanjay Patel ret fp128 %r 81486ed885SArthur Eubanks} 82486ed885SArthur Eubanks 83486ed885SArthur Eubanksdefine ppc_fp128 @fold_from_fp16_to_ppcfp128_b() { 84*8148c28fSSanjay Patel; CHECK-LABEL: @fold_from_fp16_to_ppcfp128_b( 85*8148c28fSSanjay Patel; CHECK-NEXT: ret ppc_fp128 0xM40100000000000000000000000000000 86*8148c28fSSanjay Patel; 87*8148c28fSSanjay Patel %a = call i16 @llvm.convert.to.fp16.f64(double 4.0) 88*8148c28fSSanjay Patel %r = call ppc_fp128 @llvm.convert.from.fp16.ppcf128(i16 %a) 89*8148c28fSSanjay Patel ret ppc_fp128 %r 90486ed885SArthur Eubanks} 91486ed885SArthur Eubanks 92*8148c28fSSanjay Patel; This would assert because converting SNAN causes an invalidOp status. 93*8148c28fSSanjay Patel; PR56981 94*8148c28fSSanjay Patel 95*8148c28fSSanjay Pateldefine float @convert_snan() { 96*8148c28fSSanjay Patel; CHECK-LABEL: @convert_snan( 97*8148c28fSSanjay Patel; CHECK-NEXT: ret float 0x7FF8040000000000 98*8148c28fSSanjay Patel; 99*8148c28fSSanjay Patel %r = call float @llvm.convert.from.fp16.f32(i16 31745) ; 0x7c01 100*8148c28fSSanjay Patel ret float %r 101*8148c28fSSanjay Patel} 102486ed885SArthur Eubanks 103486ed885SArthur Eubanksdeclare i16 @llvm.convert.to.fp16.f64(double) 104486ed885SArthur Eubanksdeclare float @llvm.convert.from.fp16.f32(i16) 105486ed885SArthur Eubanksdeclare double @llvm.convert.from.fp16.f64(i16) 106486ed885SArthur Eubanksdeclare x86_fp80 @llvm.convert.from.fp16.f80(i16) 107486ed885SArthur Eubanksdeclare fp128 @llvm.convert.from.fp16.f128(i16) 108486ed885SArthur Eubanksdeclare ppc_fp128 @llvm.convert.from.fp16.ppcf128(i16) 109