CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
383 lines
21 KiB
LLVM
383 lines
21 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 6
|
|
; RUN: opt -S -mtriple=x86_64-- -passes='require<libcall-lowering-info>,expand-ir-insts' -expand-fp-convert-bits=0 < %s | FileCheck %s
|
|
|
|
; Test small bit widths that can be verified by alive2.
|
|
|
|
define half @uitofp_i32_f16(i32 %x) {
|
|
; CHECK-LABEL: define half @uitofp_i32_f16(
|
|
; CHECK-SAME: i32 [[X:%.*]]) {
|
|
; CHECK-NEXT: [[ITOFP_ENTRY:.*]]:
|
|
; CHECK-NEXT: [[TMP8:%.*]] = freeze i32 [[X]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[TMP8]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label %[[ITOFP_RETURN:.*]], label %[[ITOFP_IF_END:.*]], !prof [[PROF0:![0-9]+]]
|
|
; CHECK: [[ITOFP_IF_END]]:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[TMP8]], 31
|
|
; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], [[TMP8]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = sub i32 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.ctlz.i32(i32 [[TMP8]], i1 true)
|
|
; CHECK-NEXT: [[TMP5:%.*]] = sub i32 32, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 31, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = icmp sgt i32 [[TMP5]], 24
|
|
; CHECK-NEXT: br i1 [[TMP7]], label %[[ITOFP_IF_THEN4:.*]], label %[[ITOFP_IF_ELSE:.*]], !prof [[PROF1:![0-9]+]]
|
|
; CHECK: [[ITOFP_IF_THEN4]]:
|
|
; CHECK-NEXT: switch i32 [[TMP5]], label %[[ITOFP_SW_DEFAULT:.*]] [
|
|
; CHECK-NEXT: i32 25, label %[[ITOFP_SW_BB:.*]]
|
|
; CHECK-NEXT: i32 26, label %[[ITOFP_SW_EPILOG:.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF2:![0-9]+]]
|
|
; CHECK: [[ITOFP_SW_BB]]:
|
|
; CHECK-NEXT: [[TMP41:%.*]] = shl i32 [[TMP8]], 1
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_DEFAULT]]:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = sub i32 6, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP10:%.*]] = lshr i32 [[TMP8]], [[TMP9]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = add i32 [[TMP4]], 26
|
|
; CHECK-NEXT: [[TMP12:%.*]] = lshr i32 -1, [[TMP11]]
|
|
; CHECK-NEXT: [[TMP13:%.*]] = and i32 [[TMP12]], [[TMP8]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
|
|
; CHECK-NEXT: [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
|
|
; CHECK-NEXT: [[TMP16:%.*]] = or i32 [[TMP10]], [[TMP15]]
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_EPILOG]]:
|
|
; CHECK-NEXT: [[TMP17:%.*]] = phi i32 [ [[TMP16]], %[[ITOFP_SW_DEFAULT]] ], [ [[TMP8]], %[[ITOFP_IF_THEN4]] ], [ [[TMP41]], %[[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP18:%.*]] = lshr i32 [[TMP17]], 2
|
|
; CHECK-NEXT: [[TMP19:%.*]] = and i32 [[TMP18]], 1
|
|
; CHECK-NEXT: [[TMP20:%.*]] = or i32 [[TMP17]], [[TMP19]]
|
|
; CHECK-NEXT: [[TMP21:%.*]] = add i32 [[TMP20]], 1
|
|
; CHECK-NEXT: [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i32 [[TMP21]], 67108864
|
|
; CHECK-NEXT: [[TMP23:%.*]] = icmp eq i32 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP24:%.*]] = lshr i32 [[TMP22]], 32
|
|
; CHECK-NEXT: br i1 [[TMP23]], label %[[ITOFP_IF_END26:.*]], label %[[ITOFP_IF_THEN20:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN20]]:
|
|
; CHECK-NEXT: [[TMP25:%.*]] = lshr i32 [[TMP21]], 3
|
|
; CHECK-NEXT: [[TMP26:%.*]] = lshr i32 [[TMP25]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_ELSE]]:
|
|
; CHECK-NEXT: [[TMP27:%.*]] = add i32 [[TMP4]], -8
|
|
; CHECK-NEXT: [[TMP28:%.*]] = shl i32 [[TMP8]], [[TMP27]]
|
|
; CHECK-NEXT: [[TMP29:%.*]] = lshr i32 [[TMP28]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_END26]]:
|
|
; CHECK-NEXT: [[TMP30:%.*]] = phi i32 [ [[TMP25]], %[[ITOFP_IF_THEN20]] ], [ [[TMP22]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP28]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP31:%.*]] = phi i32 [ [[TMP5]], %[[ITOFP_IF_THEN20]] ], [ [[TMP6]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP6]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP32:%.*]] = and i32 [[TMP1]], -2147483648
|
|
; CHECK-NEXT: [[TMP33:%.*]] = shl i32 [[TMP31]], 23
|
|
; CHECK-NEXT: [[TMP34:%.*]] = add i32 [[TMP33]], 1065353216
|
|
; CHECK-NEXT: [[TMP35:%.*]] = and i32 [[TMP30]], 8388607
|
|
; CHECK-NEXT: [[TMP36:%.*]] = or i32 [[TMP35]], [[TMP32]]
|
|
; CHECK-NEXT: [[TMP37:%.*]] = or i32 [[TMP35]], [[TMP34]]
|
|
; CHECK-NEXT: [[TMP38:%.*]] = bitcast i32 [[TMP37]] to float
|
|
; CHECK-NEXT: [[TMP39:%.*]] = fptrunc float [[TMP38]] to half
|
|
; CHECK-NEXT: br label %[[ITOFP_RETURN]]
|
|
; CHECK: [[ITOFP_RETURN]]:
|
|
; CHECK-NEXT: [[TMP40:%.*]] = phi half [ [[TMP39]], %[[ITOFP_IF_END26]] ], [ 0.000000e+00, %[[ITOFP_ENTRY]] ]
|
|
; CHECK-NEXT: ret half [[TMP40]]
|
|
;
|
|
%res = uitofp i32 %x to half
|
|
ret half %res
|
|
}
|
|
|
|
define half @uitofp_i32_f16_noundef(i32 noundef %x) {
|
|
; CHECK-LABEL: define half @uitofp_i32_f16_noundef(
|
|
; CHECK-SAME: i32 noundef [[X:%.*]]) {
|
|
; CHECK-NEXT: [[ITOFP_ENTRY:.*]]:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[X]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label %[[ITOFP_RETURN:.*]], label %[[ITOFP_IF_END:.*]], !prof [[PROF0]]
|
|
; CHECK: [[ITOFP_IF_END]]:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[X]], 31
|
|
; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], [[X]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = sub i32 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X]], i1 true)
|
|
; CHECK-NEXT: [[TMP5:%.*]] = sub i32 32, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 31, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = icmp sgt i32 [[TMP5]], 24
|
|
; CHECK-NEXT: br i1 [[TMP7]], label %[[ITOFP_IF_THEN4:.*]], label %[[ITOFP_IF_ELSE:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN4]]:
|
|
; CHECK-NEXT: switch i32 [[TMP5]], label %[[ITOFP_SW_DEFAULT:.*]] [
|
|
; CHECK-NEXT: i32 25, label %[[ITOFP_SW_BB:.*]]
|
|
; CHECK-NEXT: i32 26, label %[[ITOFP_SW_EPILOG:.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF2]]
|
|
; CHECK: [[ITOFP_SW_BB]]:
|
|
; CHECK-NEXT: [[TMP8:%.*]] = shl i32 [[X]], 1
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_DEFAULT]]:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = sub i32 6, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP10:%.*]] = lshr i32 [[X]], [[TMP9]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = add i32 [[TMP4]], 26
|
|
; CHECK-NEXT: [[TMP12:%.*]] = lshr i32 -1, [[TMP11]]
|
|
; CHECK-NEXT: [[TMP13:%.*]] = and i32 [[TMP12]], [[X]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
|
|
; CHECK-NEXT: [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
|
|
; CHECK-NEXT: [[TMP16:%.*]] = or i32 [[TMP10]], [[TMP15]]
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_EPILOG]]:
|
|
; CHECK-NEXT: [[TMP17:%.*]] = phi i32 [ [[TMP16]], %[[ITOFP_SW_DEFAULT]] ], [ [[X]], %[[ITOFP_IF_THEN4]] ], [ [[TMP8]], %[[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP18:%.*]] = lshr i32 [[TMP17]], 2
|
|
; CHECK-NEXT: [[TMP19:%.*]] = and i32 [[TMP18]], 1
|
|
; CHECK-NEXT: [[TMP20:%.*]] = or i32 [[TMP17]], [[TMP19]]
|
|
; CHECK-NEXT: [[TMP21:%.*]] = add i32 [[TMP20]], 1
|
|
; CHECK-NEXT: [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i32 [[TMP21]], 67108864
|
|
; CHECK-NEXT: [[TMP23:%.*]] = icmp eq i32 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP24:%.*]] = lshr i32 [[TMP22]], 32
|
|
; CHECK-NEXT: br i1 [[TMP23]], label %[[ITOFP_IF_END26:.*]], label %[[ITOFP_IF_THEN20:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN20]]:
|
|
; CHECK-NEXT: [[TMP25:%.*]] = lshr i32 [[TMP21]], 3
|
|
; CHECK-NEXT: [[TMP26:%.*]] = lshr i32 [[TMP25]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_ELSE]]:
|
|
; CHECK-NEXT: [[TMP27:%.*]] = add i32 [[TMP4]], -8
|
|
; CHECK-NEXT: [[TMP28:%.*]] = shl i32 [[X]], [[TMP27]]
|
|
; CHECK-NEXT: [[TMP29:%.*]] = lshr i32 [[TMP28]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_END26]]:
|
|
; CHECK-NEXT: [[TMP30:%.*]] = phi i32 [ [[TMP25]], %[[ITOFP_IF_THEN20]] ], [ [[TMP22]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP28]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP31:%.*]] = phi i32 [ [[TMP5]], %[[ITOFP_IF_THEN20]] ], [ [[TMP6]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP6]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP32:%.*]] = and i32 [[TMP1]], -2147483648
|
|
; CHECK-NEXT: [[TMP33:%.*]] = shl i32 [[TMP31]], 23
|
|
; CHECK-NEXT: [[TMP34:%.*]] = add i32 [[TMP33]], 1065353216
|
|
; CHECK-NEXT: [[TMP35:%.*]] = and i32 [[TMP30]], 8388607
|
|
; CHECK-NEXT: [[TMP36:%.*]] = or i32 [[TMP35]], [[TMP32]]
|
|
; CHECK-NEXT: [[TMP37:%.*]] = or i32 [[TMP35]], [[TMP34]]
|
|
; CHECK-NEXT: [[TMP38:%.*]] = bitcast i32 [[TMP37]] to float
|
|
; CHECK-NEXT: [[TMP39:%.*]] = fptrunc float [[TMP38]] to half
|
|
; CHECK-NEXT: br label %[[ITOFP_RETURN]]
|
|
; CHECK: [[ITOFP_RETURN]]:
|
|
; CHECK-NEXT: [[TMP40:%.*]] = phi half [ [[TMP39]], %[[ITOFP_IF_END26]] ], [ 0.000000e+00, %[[ITOFP_ENTRY]] ]
|
|
; CHECK-NEXT: ret half [[TMP40]]
|
|
;
|
|
%res = uitofp i32 %x to half
|
|
ret half %res
|
|
}
|
|
|
|
define half @uitofp_i16_f16(i16 %x) {
|
|
; CHECK-LABEL: define half @uitofp_i16_f16(
|
|
; CHECK-SAME: i16 [[X:%.*]]) {
|
|
; CHECK-NEXT: [[ITOFP_ENTRY:.*]]:
|
|
; CHECK-NEXT: [[TMP42:%.*]] = freeze i16 [[X]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[TMP42]] to i32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 0
|
|
; CHECK-NEXT: br i1 [[TMP1]], label %[[ITOFP_RETURN:.*]], label %[[ITOFP_IF_END:.*]], !prof [[PROF0]]
|
|
; CHECK: [[ITOFP_IF_END]]:
|
|
; CHECK-NEXT: [[TMP2:%.*]] = ashr i32 [[TMP0]], 31
|
|
; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[TMP2]], [[TMP0]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP3]], [[TMP2]]
|
|
; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.ctlz.i32(i32 [[TMP0]], i1 true)
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 32, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 31, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
|
|
; CHECK-NEXT: br i1 [[TMP8]], label %[[ITOFP_IF_THEN4:.*]], label %[[ITOFP_IF_ELSE:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN4]]:
|
|
; CHECK-NEXT: switch i32 [[TMP6]], label %[[ITOFP_SW_DEFAULT:.*]] [
|
|
; CHECK-NEXT: i32 25, label %[[ITOFP_SW_BB:.*]]
|
|
; CHECK-NEXT: i32 26, label %[[ITOFP_SW_EPILOG:.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF2]]
|
|
; CHECK: [[ITOFP_SW_BB]]:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = shl i32 [[TMP0]], 1
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_DEFAULT]]:
|
|
; CHECK-NEXT: [[TMP10:%.*]] = sub i32 6, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = lshr i32 [[TMP0]], [[TMP10]]
|
|
; CHECK-NEXT: [[TMP12:%.*]] = add i32 [[TMP5]], 26
|
|
; CHECK-NEXT: [[TMP13:%.*]] = lshr i32 -1, [[TMP12]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = and i32 [[TMP13]], [[TMP0]]
|
|
; CHECK-NEXT: [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
|
|
; CHECK-NEXT: [[TMP16:%.*]] = zext i1 [[TMP15]] to i32
|
|
; CHECK-NEXT: [[TMP17:%.*]] = or i32 [[TMP11]], [[TMP16]]
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_EPILOG]]:
|
|
; CHECK-NEXT: [[TMP18:%.*]] = phi i32 [ [[TMP17]], %[[ITOFP_SW_DEFAULT]] ], [ [[TMP0]], %[[ITOFP_IF_THEN4]] ], [ [[TMP9]], %[[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP19:%.*]] = lshr i32 [[TMP18]], 2
|
|
; CHECK-NEXT: [[TMP20:%.*]] = and i32 [[TMP19]], 1
|
|
; CHECK-NEXT: [[TMP21:%.*]] = or i32 [[TMP18]], [[TMP20]]
|
|
; CHECK-NEXT: [[TMP22:%.*]] = add i32 [[TMP21]], 1
|
|
; CHECK-NEXT: [[TMP23:%.*]] = lshr i32 [[TMP22]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i32 [[TMP22]], 67108864
|
|
; CHECK-NEXT: [[TMP24:%.*]] = icmp eq i32 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP25:%.*]] = lshr i32 [[TMP23]], 32
|
|
; CHECK-NEXT: br i1 [[TMP24]], label %[[ITOFP_IF_END26:.*]], label %[[ITOFP_IF_THEN20:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN20]]:
|
|
; CHECK-NEXT: [[TMP26:%.*]] = lshr i32 [[TMP22]], 3
|
|
; CHECK-NEXT: [[TMP27:%.*]] = lshr i32 [[TMP26]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_ELSE]]:
|
|
; CHECK-NEXT: [[TMP28:%.*]] = add i32 [[TMP5]], -8
|
|
; CHECK-NEXT: [[TMP29:%.*]] = shl i32 [[TMP0]], [[TMP28]]
|
|
; CHECK-NEXT: [[TMP30:%.*]] = lshr i32 [[TMP29]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_END26]]:
|
|
; CHECK-NEXT: [[TMP31:%.*]] = phi i32 [ [[TMP26]], %[[ITOFP_IF_THEN20]] ], [ [[TMP23]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP29]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP32:%.*]] = phi i32 [ [[TMP6]], %[[ITOFP_IF_THEN20]] ], [ [[TMP7]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP7]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP33:%.*]] = and i32 [[TMP2]], -2147483648
|
|
; CHECK-NEXT: [[TMP34:%.*]] = shl i32 [[TMP32]], 23
|
|
; CHECK-NEXT: [[TMP35:%.*]] = add i32 [[TMP34]], 1065353216
|
|
; CHECK-NEXT: [[TMP36:%.*]] = and i32 [[TMP31]], 8388607
|
|
; CHECK-NEXT: [[TMP37:%.*]] = or i32 [[TMP36]], [[TMP33]]
|
|
; CHECK-NEXT: [[TMP38:%.*]] = or i32 [[TMP36]], [[TMP35]]
|
|
; CHECK-NEXT: [[TMP39:%.*]] = bitcast i32 [[TMP38]] to float
|
|
; CHECK-NEXT: [[TMP40:%.*]] = fptrunc float [[TMP39]] to half
|
|
; CHECK-NEXT: br label %[[ITOFP_RETURN]]
|
|
; CHECK: [[ITOFP_RETURN]]:
|
|
; CHECK-NEXT: [[TMP41:%.*]] = phi half [ [[TMP40]], %[[ITOFP_IF_END26]] ], [ 0.000000e+00, %[[ITOFP_ENTRY]] ]
|
|
; CHECK-NEXT: ret half [[TMP41]]
|
|
;
|
|
%res = uitofp i16 %x to half
|
|
ret half %res
|
|
}
|
|
|
|
define half @sitofp_i32_f16(i32 %x) {
|
|
; CHECK-LABEL: define half @sitofp_i32_f16(
|
|
; CHECK-SAME: i32 [[X:%.*]]) {
|
|
; CHECK-NEXT: [[ITOFP_ENTRY:.*]]:
|
|
; CHECK-NEXT: [[TMP41:%.*]] = freeze i32 [[X]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[TMP41]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label %[[ITOFP_RETURN:.*]], label %[[ITOFP_IF_END:.*]], !prof [[PROF0]]
|
|
; CHECK: [[ITOFP_IF_END]]:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[TMP41]], 31
|
|
; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], [[TMP41]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = sub i32 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.ctlz.i32(i32 [[TMP3]], i1 true)
|
|
; CHECK-NEXT: [[TMP5:%.*]] = sub i32 32, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 31, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = icmp sgt i32 [[TMP5]], 24
|
|
; CHECK-NEXT: br i1 [[TMP7]], label %[[ITOFP_IF_THEN4:.*]], label %[[ITOFP_IF_ELSE:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN4]]:
|
|
; CHECK-NEXT: switch i32 [[TMP5]], label %[[ITOFP_SW_DEFAULT:.*]] [
|
|
; CHECK-NEXT: i32 25, label %[[ITOFP_SW_BB:.*]]
|
|
; CHECK-NEXT: i32 26, label %[[ITOFP_SW_EPILOG:.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF2]]
|
|
; CHECK: [[ITOFP_SW_BB]]:
|
|
; CHECK-NEXT: [[TMP8:%.*]] = shl i32 [[TMP3]], 1
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_DEFAULT]]:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = sub i32 6, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP10:%.*]] = lshr i32 [[TMP3]], [[TMP9]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = add i32 [[TMP4]], 26
|
|
; CHECK-NEXT: [[TMP12:%.*]] = lshr i32 -1, [[TMP11]]
|
|
; CHECK-NEXT: [[TMP13:%.*]] = and i32 [[TMP12]], [[TMP3]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
|
|
; CHECK-NEXT: [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
|
|
; CHECK-NEXT: [[TMP16:%.*]] = or i32 [[TMP10]], [[TMP15]]
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_EPILOG]]:
|
|
; CHECK-NEXT: [[TMP17:%.*]] = phi i32 [ [[TMP16]], %[[ITOFP_SW_DEFAULT]] ], [ [[TMP3]], %[[ITOFP_IF_THEN4]] ], [ [[TMP8]], %[[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP18:%.*]] = lshr i32 [[TMP17]], 2
|
|
; CHECK-NEXT: [[TMP19:%.*]] = and i32 [[TMP18]], 1
|
|
; CHECK-NEXT: [[TMP20:%.*]] = or i32 [[TMP17]], [[TMP19]]
|
|
; CHECK-NEXT: [[TMP21:%.*]] = add i32 [[TMP20]], 1
|
|
; CHECK-NEXT: [[TMP22:%.*]] = ashr i32 [[TMP21]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i32 [[TMP21]], 67108864
|
|
; CHECK-NEXT: [[TMP23:%.*]] = icmp eq i32 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP24:%.*]] = lshr i32 [[TMP22]], 32
|
|
; CHECK-NEXT: br i1 [[TMP23]], label %[[ITOFP_IF_END26:.*]], label %[[ITOFP_IF_THEN20:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN20]]:
|
|
; CHECK-NEXT: [[TMP25:%.*]] = ashr i32 [[TMP21]], 3
|
|
; CHECK-NEXT: [[TMP26:%.*]] = lshr i32 [[TMP25]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_ELSE]]:
|
|
; CHECK-NEXT: [[TMP27:%.*]] = add i32 [[TMP4]], -8
|
|
; CHECK-NEXT: [[TMP28:%.*]] = shl i32 [[TMP3]], [[TMP27]]
|
|
; CHECK-NEXT: [[TMP29:%.*]] = lshr i32 [[TMP28]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_END26]]:
|
|
; CHECK-NEXT: [[TMP30:%.*]] = phi i32 [ [[TMP25]], %[[ITOFP_IF_THEN20]] ], [ [[TMP22]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP28]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP31:%.*]] = phi i32 [ [[TMP5]], %[[ITOFP_IF_THEN20]] ], [ [[TMP6]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP6]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP32:%.*]] = and i32 [[TMP1]], -2147483648
|
|
; CHECK-NEXT: [[TMP33:%.*]] = shl i32 [[TMP31]], 23
|
|
; CHECK-NEXT: [[TMP34:%.*]] = add i32 [[TMP33]], 1065353216
|
|
; CHECK-NEXT: [[TMP35:%.*]] = and i32 [[TMP30]], 8388607
|
|
; CHECK-NEXT: [[TMP36:%.*]] = or i32 [[TMP35]], [[TMP32]]
|
|
; CHECK-NEXT: [[TMP37:%.*]] = or i32 [[TMP36]], [[TMP34]]
|
|
; CHECK-NEXT: [[TMP38:%.*]] = bitcast i32 [[TMP37]] to float
|
|
; CHECK-NEXT: [[TMP39:%.*]] = fptrunc float [[TMP38]] to half
|
|
; CHECK-NEXT: br label %[[ITOFP_RETURN]]
|
|
; CHECK: [[ITOFP_RETURN]]:
|
|
; CHECK-NEXT: [[TMP40:%.*]] = phi half [ [[TMP39]], %[[ITOFP_IF_END26]] ], [ 0.000000e+00, %[[ITOFP_ENTRY]] ]
|
|
; CHECK-NEXT: ret half [[TMP40]]
|
|
;
|
|
%res = sitofp i32 %x to half
|
|
ret half %res
|
|
}
|
|
|
|
define half @sitofp_i16_f16(i16 %x) {
|
|
; CHECK-LABEL: define half @sitofp_i16_f16(
|
|
; CHECK-SAME: i16 [[X:%.*]]) {
|
|
; CHECK-NEXT: [[ITOFP_ENTRY:.*]]:
|
|
; CHECK-NEXT: [[TMP42:%.*]] = freeze i16 [[X]]
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[TMP42]] to i32
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[TMP1]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label %[[ITOFP_RETURN:.*]], label %[[ITOFP_IF_END:.*]], !prof [[PROF0]]
|
|
; CHECK: [[ITOFP_IF_END]]:
|
|
; CHECK-NEXT: [[TMP2:%.*]] = ashr i32 [[TMP1]], 31
|
|
; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP3]], [[TMP2]]
|
|
; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.ctlz.i32(i32 [[TMP4]], i1 true)
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 32, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP8:%.*]] = sub i32 31, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = icmp sgt i32 [[TMP6]], 24
|
|
; CHECK-NEXT: br i1 [[TMP7]], label %[[ITOFP_IF_THEN4:.*]], label %[[ITOFP_IF_ELSE:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN4]]:
|
|
; CHECK-NEXT: switch i32 [[TMP6]], label %[[ITOFP_SW_DEFAULT:.*]] [
|
|
; CHECK-NEXT: i32 25, label %[[ITOFP_SW_BB:.*]]
|
|
; CHECK-NEXT: i32 26, label %[[ITOFP_SW_EPILOG:.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF2]]
|
|
; CHECK: [[ITOFP_SW_BB]]:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = shl i32 [[TMP4]], 1
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_DEFAULT]]:
|
|
; CHECK-NEXT: [[TMP10:%.*]] = sub i32 6, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = lshr i32 [[TMP4]], [[TMP10]]
|
|
; CHECK-NEXT: [[TMP12:%.*]] = add i32 [[TMP5]], 26
|
|
; CHECK-NEXT: [[TMP13:%.*]] = lshr i32 -1, [[TMP12]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = and i32 [[TMP13]], [[TMP4]]
|
|
; CHECK-NEXT: [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
|
|
; CHECK-NEXT: [[TMP16:%.*]] = zext i1 [[TMP15]] to i32
|
|
; CHECK-NEXT: [[TMP17:%.*]] = or i32 [[TMP11]], [[TMP16]]
|
|
; CHECK-NEXT: br label %[[ITOFP_SW_EPILOG]]
|
|
; CHECK: [[ITOFP_SW_EPILOG]]:
|
|
; CHECK-NEXT: [[TMP18:%.*]] = phi i32 [ [[TMP17]], %[[ITOFP_SW_DEFAULT]] ], [ [[TMP4]], %[[ITOFP_IF_THEN4]] ], [ [[TMP9]], %[[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP19:%.*]] = lshr i32 [[TMP18]], 2
|
|
; CHECK-NEXT: [[TMP20:%.*]] = and i32 [[TMP19]], 1
|
|
; CHECK-NEXT: [[TMP21:%.*]] = or i32 [[TMP18]], [[TMP20]]
|
|
; CHECK-NEXT: [[TMP22:%.*]] = add i32 [[TMP21]], 1
|
|
; CHECK-NEXT: [[TMP24:%.*]] = ashr i32 [[TMP22]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i32 [[TMP22]], 67108864
|
|
; CHECK-NEXT: [[TMP23:%.*]] = icmp eq i32 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP25:%.*]] = lshr i32 [[TMP24]], 32
|
|
; CHECK-NEXT: br i1 [[TMP23]], label %[[ITOFP_IF_END26:.*]], label %[[ITOFP_IF_THEN20:.*]], !prof [[PROF1]]
|
|
; CHECK: [[ITOFP_IF_THEN20]]:
|
|
; CHECK-NEXT: [[TMP26:%.*]] = ashr i32 [[TMP22]], 3
|
|
; CHECK-NEXT: [[TMP27:%.*]] = lshr i32 [[TMP26]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_ELSE]]:
|
|
; CHECK-NEXT: [[TMP28:%.*]] = add i32 [[TMP5]], -8
|
|
; CHECK-NEXT: [[TMP29:%.*]] = shl i32 [[TMP4]], [[TMP28]]
|
|
; CHECK-NEXT: [[TMP30:%.*]] = lshr i32 [[TMP29]], 32
|
|
; CHECK-NEXT: br label %[[ITOFP_IF_END26]]
|
|
; CHECK: [[ITOFP_IF_END26]]:
|
|
; CHECK-NEXT: [[TMP31:%.*]] = phi i32 [ [[TMP26]], %[[ITOFP_IF_THEN20]] ], [ [[TMP24]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP29]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP32:%.*]] = phi i32 [ [[TMP6]], %[[ITOFP_IF_THEN20]] ], [ [[TMP8]], %[[ITOFP_SW_EPILOG]] ], [ [[TMP8]], %[[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP33:%.*]] = and i32 [[TMP2]], -2147483648
|
|
; CHECK-NEXT: [[TMP34:%.*]] = shl i32 [[TMP32]], 23
|
|
; CHECK-NEXT: [[TMP35:%.*]] = add i32 [[TMP34]], 1065353216
|
|
; CHECK-NEXT: [[TMP36:%.*]] = and i32 [[TMP31]], 8388607
|
|
; CHECK-NEXT: [[TMP37:%.*]] = or i32 [[TMP36]], [[TMP33]]
|
|
; CHECK-NEXT: [[TMP41:%.*]] = or i32 [[TMP37]], [[TMP35]]
|
|
; CHECK-NEXT: [[TMP38:%.*]] = bitcast i32 [[TMP41]] to float
|
|
; CHECK-NEXT: [[TMP39:%.*]] = fptrunc float [[TMP38]] to half
|
|
; CHECK-NEXT: br label %[[ITOFP_RETURN]]
|
|
; CHECK: [[ITOFP_RETURN]]:
|
|
; CHECK-NEXT: [[TMP40:%.*]] = phi half [ [[TMP39]], %[[ITOFP_IF_END26]] ], [ 0.000000e+00, %[[ITOFP_ENTRY]] ]
|
|
; CHECK-NEXT: ret half [[TMP40]]
|
|
;
|
|
%res = sitofp i16 %x to half
|
|
ret half %res
|
|
}
|
|
;.
|
|
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
|
|
;.
|
|
; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 1048575}
|
|
; CHECK: [[PROF1]] = !{!"branch_weights", i32 1048575, i32 1}
|
|
; CHECK: [[PROF2]] = !{!"branch_weights", i32 1048575, i32 1, i32 1}
|
|
;.
|