
Now that we don't accept undef splat in PatternMatch, we can remove some uses of replaceUndefsWith(). I believe in all these cases only poison splats are possible now, in which case no replacement is necessary.
1128 lines
39 KiB
LLVM
1128 lines
39 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
|
|
|
|
define half @test_ui_ui_i8_add(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_add(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 127
|
|
; CHECK-NEXT: [[Y:%.*]] = and i8 [[Y_IN:%.*]], 127
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nuw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 127
|
|
%y = and i8 %y_in, 127
|
|
%xf = uitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_add_fail_overflow(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_add_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 127
|
|
; CHECK-NEXT: [[Y:%.*]] = and i8 [[Y_IN:%.*]], -127
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = uitofp i8 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 127
|
|
%y = and i8 %y_in, 129
|
|
%xf = uitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_add_C(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_add_C(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X_IN:%.*]], -128
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 127
|
|
%xf = uitofp i8 %x to half
|
|
%r = fadd half %xf, 128.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_add_C_fail_no_repr(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_add_C_fail_no_repr(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 127
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], 0xH57F8
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 127
|
|
%xf = uitofp i8 %x to half
|
|
%r = fadd half %xf, 127.5
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_add_C_fail_overflow(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_add_C_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 127
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], 0xH5808
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 127
|
|
%xf = uitofp i8 %x to half
|
|
%r = fadd half %xf, 129.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_add(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_add(
|
|
; CHECK-NEXT: [[X:%.*]] = or i8 [[X_IN:%.*]], -64
|
|
; CHECK-NEXT: [[Y:%.*]] = or i8 [[Y_IN:%.*]], -64
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nsw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i8 %x_in, -64
|
|
%y = or i8 %y_in, -64
|
|
%xf = sitofp i8 %x to half
|
|
%yf = sitofp i8 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_add_fail_overflow(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_add_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = or i8 [[X_IN:%.*]], -64
|
|
; CHECK-NEXT: [[Y:%.*]] = or i8 [[Y_IN:%.*]], -65
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i8 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i8 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i8 %x_in, -64
|
|
%y = or i8 %y_in, -65
|
|
%xf = sitofp i8 %x to half
|
|
%yf = sitofp i8 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i8_add(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i8_add(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 63
|
|
; CHECK-NEXT: [[Y:%.*]] = and i8 [[Y_IN:%.*]], 63
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 63
|
|
%y = and i8 %y_in, 63
|
|
%xf = sitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i8_add_overflow(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i8_add_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 63
|
|
; CHECK-NEXT: [[Y:%.*]] = and i8 [[Y_IN:%.*]], 65
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nuw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 63
|
|
%y = and i8 %y_in, 65
|
|
%xf = sitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_sub_C(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_sub_C(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X_IN:%.*]], 127
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i8 %x_in, 128
|
|
%xf = uitofp i8 %x to half
|
|
%r = fsub half %xf, 128.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_sub_C_fail_overflow(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_sub_C_fail_overflow(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X_IN:%.*]], -128
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 127
|
|
%xf = uitofp i8 %x to half
|
|
%r = fsub half %xf, 128.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_sub(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_sub(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 63
|
|
; CHECK-NEXT: [[Y:%.*]] = or i8 [[Y_IN:%.*]], -64
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sub nsw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 63
|
|
%y = or i8 %y_in, -64
|
|
%xf = sitofp i8 %x to half
|
|
%yf = sitofp i8 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_sub_fail_overflow(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_sub_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 63
|
|
; CHECK-NEXT: [[Y:%.*]] = or i8 [[Y_IN:%.*]], -65
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i8 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fsub half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 63
|
|
%y = or i8 %y_in, -65
|
|
%xf = sitofp i8 %x to half
|
|
%yf = sitofp i8 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_sub_C(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_sub_C(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 63
|
|
; CHECK-NEXT: [[TMP1:%.*]] = or disjoint i8 [[X]], 64
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 63
|
|
%xf = sitofp i8 %x to half
|
|
%r = fsub half %xf, -64.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_sub_C_fail_overflow(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_sub_C_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 65
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nuw i8 [[X]], 64
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 65
|
|
%xf = sitofp i8 %x to half
|
|
%r = fsub half %xf, -64.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i8_sub(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i8_sub(
|
|
; CHECK-NEXT: [[X:%.*]] = or i8 [[X_IN:%.*]], 64
|
|
; CHECK-NEXT: [[Y:%.*]] = and i8 [[Y_IN:%.*]], 63
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sub nuw nsw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i8 %x_in, 64
|
|
%y = and i8 %y_in, 63
|
|
%xf = sitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i8_sub_fail_maybe_sign(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i8_sub_fail_maybe_sign(
|
|
; CHECK-NEXT: [[X:%.*]] = or i8 [[X_IN:%.*]], 64
|
|
; CHECK-NEXT: [[Y:%.*]] = and i8 [[Y_IN:%.*]], 63
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sub nuw nsw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i8 %x_in, 64
|
|
%y = and i8 %y_in, 63
|
|
%xf = uitofp i8 %x to half
|
|
%yf = sitofp i8 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_mul(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_mul(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 15
|
|
; CHECK-NEXT: [[Y:%.*]] = and i8 [[Y_IN:%.*]], 15
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 15
|
|
%y = and i8 %y_in, 15
|
|
%xf = uitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_mul_C(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_mul_C(
|
|
; CHECK-NEXT: [[X:%.*]] = shl i8 [[X_IN:%.*]], 4
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i8 [[X]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 15
|
|
%xf = uitofp i8 %x to half
|
|
%r = fmul half %xf, 16.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i8_mul_C_fail_overlow(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i8_mul_C_fail_overlow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 14
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], 0xH4CC0
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 14
|
|
%xf = uitofp i8 %x to half
|
|
%r = fmul half %xf, 19.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_mul(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_mul(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i8 [[X_IN:%.*]], 6
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i8 [[XX]], 1
|
|
; CHECK-NEXT: [[Y:%.*]] = or i8 [[Y_IN:%.*]], -8
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nsw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i8 %x_in, 6
|
|
%x = add nsw nuw i8 %xx, 1
|
|
%y = or i8 %y_in, -8
|
|
%xf = sitofp i8 %x to half
|
|
%yf = sitofp i8 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_mul_fail_maybe_zero(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_mul_fail_maybe_zero(
|
|
; CHECK-NEXT: [[X:%.*]] = and i8 [[X_IN:%.*]], 7
|
|
; CHECK-NEXT: [[Y:%.*]] = or i8 [[Y_IN:%.*]], -8
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i8 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i8 %x_in, 7
|
|
%y = or i8 %y_in, -8
|
|
%xf = sitofp i8 %x to half
|
|
%yf = sitofp i8 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_mul_C_fail_no_repr(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_mul_C_fail_no_repr(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i8 [[X_IN:%.*]], 6
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i8 [[XX]], 1
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], 0xHC780
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i8 %x_in, 6
|
|
%x = add nsw nuw i8 %xx, 1
|
|
%xf = sitofp i8 %x to half
|
|
%r = fmul half %xf, -7.5
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i8_mul_C_fail_overflow(i8 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i8_mul_C_fail_overflow(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i8 [[X_IN:%.*]], 6
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i8 [[XX]], 1
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], 0xHCCC0
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i8 %x_in, 6
|
|
%x = add nsw nuw i8 %xx, 1
|
|
%xf = sitofp i8 %x to half
|
|
%r = fmul half %xf, -19.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i8_mul(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i8_mul(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i8 [[X_IN:%.*]], 6
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i8 [[XX]], 1
|
|
; CHECK-NEXT: [[YY:%.*]] = and i8 [[Y_IN:%.*]], 7
|
|
; CHECK-NEXT: [[Y:%.*]] = add nuw nsw i8 [[YY]], 1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw nsw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i8 %x_in, 6
|
|
%x = add i8 %xx, 1
|
|
%yy = and i8 %y_in, 7
|
|
%y = add i8 %yy, 1
|
|
%xf = sitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i8_mul_fail_maybe_zero(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i8_mul_fail_maybe_zero(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i8 [[X_IN:%.*]], 7
|
|
; CHECK-NEXT: [[X:%.*]] = add nuw nsw i8 [[XX]], 1
|
|
; CHECK-NEXT: [[Y:%.*]] = and i8 [[Y_IN:%.*]], 7
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw nsw i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i8 %x_in, 7
|
|
%x = add i8 %xx, 1
|
|
%y = and i8 %y_in, 7
|
|
%xf = sitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i8_mul_fail_signed(i8 noundef %x_in, i8 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i8_mul_fail_signed(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i8 [[X_IN:%.*]], 7
|
|
; CHECK-NEXT: [[X:%.*]] = add nuw nsw i8 [[XX]], 1
|
|
; CHECK-NEXT: [[Y:%.*]] = or i8 [[Y_IN:%.*]], -4
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i8 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = uitofp i8 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i8 %x_in, 7
|
|
%x = add i8 %xx, 1
|
|
%y = or i8 %y_in, -4
|
|
%xf = sitofp i8 %x to half
|
|
%yf = uitofp i8 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i16_add(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i16_add(
|
|
; CHECK-NEXT: [[X:%.*]] = and i16 [[X_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i16 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i16 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i16 %x_in, 2047
|
|
%y = and i16 %y_in, 2047
|
|
%xf = uitofp i16 %x to half
|
|
%yf = uitofp i16 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i16_add_fail_not_promotable(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i16_add_fail_not_promotable(
|
|
; CHECK-NEXT: [[X:%.*]] = and i16 [[X_IN:%.*]], 2049
|
|
; CHECK-NEXT: [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i16 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = uitofp nneg i16 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i16 %x_in, 2049
|
|
%y = and i16 %y_in, 2047
|
|
%xf = uitofp i16 %x to half
|
|
%yf = uitofp i16 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i16_add_C(i16 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i16_add_C(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = or i16 [[X_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i16 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i16 %x_in, 2047
|
|
%xf = uitofp i16 %x to half
|
|
%r = fadd half %xf, 63488.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i16_add_C_fail_overflow(i16 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i16_add_C_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i16 [[X_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i16 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], 0xH7BD0
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i16 %x_in, 2047
|
|
%xf = uitofp i16 %x to half
|
|
%r = fadd half %xf, 64000.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_add(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_add(
|
|
; CHECK-NEXT: [[X:%.*]] = or i16 [[X_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[Y:%.*]] = or i16 [[Y_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nsw i16 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i16 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i16 %x_in, -2048
|
|
%y = or i16 %y_in, -2048
|
|
%xf = sitofp i16 %x to half
|
|
%yf = sitofp i16 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_add_fail_no_promotion(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_add_fail_no_promotion(
|
|
; CHECK-NEXT: [[XX:%.*]] = or i16 [[X_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[X:%.*]] = add nsw i16 [[XX]], -1
|
|
; CHECK-NEXT: [[Y:%.*]] = or i16 [[Y_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i16 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i16 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = or i16 %x_in, -2048
|
|
%x = sub i16 %xx, 1
|
|
%y = or i16 %y_in, -2048
|
|
%xf = sitofp i16 %x to half
|
|
%yf = sitofp i16 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_add_C_overflow(i16 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_add_C_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = or i16 [[X_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i16 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], 0xH7840
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i16 %x_in, -2048
|
|
%xf = sitofp i16 %x to half
|
|
%r = fadd half %xf, 0xH7840
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_sub(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_sub(
|
|
; CHECK-NEXT: [[X:%.*]] = or i16 [[X_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sub nuw nsw i16 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i16 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i16 %x_in, -2048
|
|
%y = and i16 %y_in, 2047
|
|
%xf = sitofp i16 %x to half
|
|
%yf = sitofp i16 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_sub_fail_no_promotion(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_sub_fail_no_promotion(
|
|
; CHECK-NEXT: [[X:%.*]] = and i16 [[X_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[Y:%.*]] = or i16 [[Y_IN:%.*]], -2049
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i16 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i16 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fsub half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i16 %x_in, 2047
|
|
%y = or i16 %y_in, -2049
|
|
%xf = sitofp i16 %x to half
|
|
%yf = sitofp i16 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i16_sub(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i16_sub(
|
|
; CHECK-NEXT: [[X:%.*]] = and i16 [[X_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sub nsw i16 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i16 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i16 %x_in, 2047
|
|
%y = and i16 %y_in, 2047
|
|
%xf = uitofp i16 %x to half
|
|
%yf = sitofp i16 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i16_sub_fail_maybe_signed(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i16_sub_fail_maybe_signed(
|
|
; CHECK-NEXT: [[X:%.*]] = or i16 [[X_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp i16 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = uitofp nneg i16 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fsub half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i16 %x_in, -2048
|
|
%y = and i16 %y_in, 2047
|
|
%xf = uitofp i16 %x to half
|
|
%yf = sitofp i16 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i16_mul(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i16_mul(
|
|
; CHECK-NEXT: [[X:%.*]] = and i16 [[X_IN:%.*]], 255
|
|
; CHECK-NEXT: [[Y:%.*]] = and i16 [[Y_IN:%.*]], 255
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw i16 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i16 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i16 %x_in, 255
|
|
%y = and i16 %y_in, 255
|
|
%xf = uitofp i16 %x to half
|
|
%yf = uitofp i16 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i16_mul_fail_no_promotion(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i16_mul_fail_no_promotion(
|
|
; CHECK-NEXT: [[X:%.*]] = and i16 [[X_IN:%.*]], 4095
|
|
; CHECK-NEXT: [[Y:%.*]] = and i16 [[Y_IN:%.*]], 3
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i16 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = uitofp nneg i16 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i16 %x_in, 4095
|
|
%y = and i16 %y_in, 3
|
|
%xf = uitofp i16 %x to half
|
|
%yf = uitofp i16 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_mul(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_mul(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i16 [[X_IN:%.*]], 126
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i16 [[XX]], 1
|
|
; CHECK-NEXT: [[Y:%.*]] = or i16 [[Y_IN:%.*]], -255
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nsw i16 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i16 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i16 %x_in, 126
|
|
%x = add nsw nuw i16 %xx, 1
|
|
%y = or i16 %y_in, -255
|
|
%xf = sitofp i16 %x to half
|
|
%yf = sitofp i16 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_mul_fail_overflow(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_mul_fail_overflow(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i16 [[X_IN:%.*]], 126
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i16 [[XX]], 1
|
|
; CHECK-NEXT: [[Y:%.*]] = or i16 [[Y_IN:%.*]], -257
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i16 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i16 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i16 %x_in, 126
|
|
%x = add nsw nuw i16 %xx, 1
|
|
%y = or i16 %y_in, -257
|
|
%xf = sitofp i16 %x to half
|
|
%yf = sitofp i16 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_mul_C_fail_overflow(i16 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_mul_C_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = or i16 [[X_IN:%.*]], -129
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i16 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], 0xH5800
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i16 %x_in, -129
|
|
%xf = sitofp i16 %x to half
|
|
%r = fmul half %xf, 128.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i16_mul_C_fail_no_promotion(i16 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i16_mul_C_fail_no_promotion(
|
|
; CHECK-NEXT: [[X:%.*]] = or i16 [[X_IN:%.*]], -4097
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i16 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], 0xH4500
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i16 %x_in, -4097
|
|
%xf = sitofp i16 %x to half
|
|
%r = fmul half %xf, 5.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i16_mul(i16 noundef %x_in, i16 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i16_mul(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i16 [[X_IN:%.*]], 126
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i16 [[XX]], 1
|
|
; CHECK-NEXT: [[YY:%.*]] = and i16 [[Y_IN:%.*]], 126
|
|
; CHECK-NEXT: [[Y:%.*]] = or disjoint i16 [[YY]], 1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw nsw i16 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i16 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i16 %x_in, 126
|
|
%x = add i16 %xx, 1
|
|
%yy = and i16 %y_in, 126
|
|
%y = add i16 %yy, 1
|
|
%xf = sitofp i16 %x to half
|
|
%yf = uitofp i16 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i12_add(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i12_add(
|
|
; CHECK-NEXT: [[X:%.*]] = and i12 [[X_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[Y:%.*]] = and i12 [[Y_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nuw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i12 %x_in, 2047
|
|
%y = and i12 %y_in, 2047
|
|
%xf = uitofp i12 %x to half
|
|
%yf = uitofp i12 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i12_add_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i12_add_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i12 [[X_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[Y:%.*]] = and i12 [[Y_IN:%.*]], -2047
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i12 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = uitofp i12 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i12 %x_in, 2047
|
|
%y = and i12 %y_in, 2049
|
|
%xf = uitofp i12 %x to half
|
|
%yf = uitofp i12 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
|
|
define half @test_si_si_i12_add(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_add(
|
|
; CHECK-NEXT: [[X:%.*]] = or i12 [[X_IN:%.*]], -1024
|
|
; CHECK-NEXT: [[Y:%.*]] = or i12 [[Y_IN:%.*]], -1024
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nsw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i12 %x_in, -1024
|
|
%y = or i12 %y_in, -1024
|
|
%xf = sitofp i12 %x to half
|
|
%yf = sitofp i12 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i12_add_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_add_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = or i12 [[X_IN:%.*]], -1025
|
|
; CHECK-NEXT: [[Y:%.*]] = or i12 [[Y_IN:%.*]], -1025
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i12 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i12 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i12 %x_in, -1025
|
|
%y = or i12 %y_in, -1025
|
|
%xf = sitofp i12 %x to half
|
|
%yf = sitofp i12 %y to half
|
|
%r = fadd half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i12_add_C_fail_overflow(i12 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_add_C_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = or i12 [[X_IN:%.*]], -2048
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i12 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fadd half [[XF]], 0xHBC00
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i12 %x_in, -2048
|
|
%xf = sitofp i12 %x to half
|
|
%r = fadd half %xf, -1.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i12_sub(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i12_sub(
|
|
; CHECK-NEXT: [[X:%.*]] = and i12 [[X_IN:%.*]], 1023
|
|
; CHECK-NEXT: [[Y:%.*]] = and i12 [[Y_IN:%.*]], 1023
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sub nsw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i12 %x_in, 1023
|
|
%y = and i12 %y_in, 1023
|
|
%xf = uitofp i12 %x to half
|
|
%yf = uitofp i12 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i12_sub_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i12_sub_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = and i12 [[X_IN:%.*]], 1023
|
|
; CHECK-NEXT: [[Y:%.*]] = and i12 [[Y_IN:%.*]], 2047
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sub nsw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i12 %x_in, 1023
|
|
%y = and i12 %y_in, 2047
|
|
%xf = uitofp i12 %x to half
|
|
%yf = uitofp i12 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
|
|
define half @test_si_si_i12_sub(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_sub(
|
|
; CHECK-NEXT: [[X:%.*]] = and i12 [[X_IN:%.*]], 1023
|
|
; CHECK-NEXT: [[Y:%.*]] = or i12 [[Y_IN:%.*]], -1024
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sub nsw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i12 %x_in, 1023
|
|
%y = or i12 %y_in, -1024
|
|
%xf = sitofp i12 %x to half
|
|
%yf = sitofp i12 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i12_sub_fail_overflow(i12 noundef %x, i12 noundef %y) {
|
|
; CHECK-LABEL: @test_si_si_i12_sub_fail_overflow(
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i12 [[X:%.*]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i12 [[Y:%.*]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fsub half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xf = sitofp i12 %x to half
|
|
%yf = sitofp i12 %y to half
|
|
%r = fsub half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i12_mul(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i12_mul(
|
|
; CHECK-NEXT: [[X:%.*]] = and i12 [[X_IN:%.*]], 31
|
|
; CHECK-NEXT: [[Y:%.*]] = and i12 [[Y_IN:%.*]], 63
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw nsw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i12 %x_in, 31
|
|
%y = and i12 %y_in, 63
|
|
%xf = uitofp i12 %x to half
|
|
%yf = uitofp i12 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i12_mul_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i12_mul_fail_overflow(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i12 [[X_IN:%.*]], 31
|
|
; CHECK-NEXT: [[X:%.*]] = add nuw nsw i12 [[XX]], 1
|
|
; CHECK-NEXT: [[Y:%.*]] = and i12 [[Y_IN:%.*]], 63
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i12 %x_in, 31
|
|
%x = add i12 %xx, 1
|
|
%y = and i12 %y_in, 63
|
|
%xf = uitofp i12 %x to half
|
|
%yf = uitofp i12 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_ui_i12_mul_C(i12 noundef %x_in) {
|
|
; CHECK-LABEL: @test_ui_ui_i12_mul_C(
|
|
; CHECK-NEXT: [[X:%.*]] = shl i12 [[X_IN:%.*]], 6
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i12 [[X]], 1984
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i12 %x_in, 31
|
|
%xf = uitofp i12 %x to half
|
|
%r = fmul half %xf, 64.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i12_mul(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_mul(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i12 [[X_IN:%.*]], 30
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i12 [[XX]], 1
|
|
; CHECK-NEXT: [[Y:%.*]] = or i12 [[Y_IN:%.*]], -64
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nsw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = sitofp i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i12 %x_in, 30
|
|
%x = add nsw nuw i12 %xx, 1
|
|
%y = or i12 %y_in, -64
|
|
%xf = sitofp i12 %x to half
|
|
%yf = sitofp i12 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i12_mul_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_mul_fail_overflow(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i12 [[X_IN:%.*]], 30
|
|
; CHECK-NEXT: [[X:%.*]] = or disjoint i12 [[XX]], 1
|
|
; CHECK-NEXT: [[Y:%.*]] = or i12 [[Y_IN:%.*]], -128
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i12 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i12 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i12 %x_in, 30
|
|
%x = add nsw nuw i12 %xx, 1
|
|
%y = or i12 %y_in, -128
|
|
%xf = sitofp i12 %x to half
|
|
%yf = sitofp i12 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i12_mul_fail_maybe_non_zero(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_mul_fail_maybe_non_zero(
|
|
; CHECK-NEXT: [[X:%.*]] = and i12 [[X_IN:%.*]], 30
|
|
; CHECK-NEXT: [[Y:%.*]] = or i12 [[Y_IN:%.*]], -128
|
|
; CHECK-NEXT: [[XF:%.*]] = uitofp nneg i12 [[X]] to half
|
|
; CHECK-NEXT: [[YF:%.*]] = sitofp i12 [[Y]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], [[YF]]
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = and i12 %x_in, 30
|
|
%y = or i12 %y_in, -128
|
|
%xf = sitofp i12 %x to half
|
|
%yf = sitofp i12 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i12_mul_C(i12 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_mul_C(
|
|
; CHECK-NEXT: [[X:%.*]] = or i12 [[X_IN:%.*]], -64
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nsw i12 [[X]], -16
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i12 %x_in, -64
|
|
%xf = sitofp i12 %x to half
|
|
%r = fmul half %xf, -16.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_si_si_i12_mul_C_fail_overflow(i12 noundef %x_in) {
|
|
; CHECK-LABEL: @test_si_si_i12_mul_C_fail_overflow(
|
|
; CHECK-NEXT: [[X:%.*]] = or i12 [[X_IN:%.*]], -64
|
|
; CHECK-NEXT: [[XF:%.*]] = sitofp i12 [[X]] to half
|
|
; CHECK-NEXT: [[R:%.*]] = fmul half [[XF]], 0xHD400
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%x = or i12 %x_in, -64
|
|
%xf = sitofp i12 %x to half
|
|
%r = fmul half %xf, -64.0
|
|
ret half %r
|
|
}
|
|
|
|
define half @test_ui_si_i12_mul_nsw(i12 noundef %x_in, i12 noundef %y_in) {
|
|
; CHECK-LABEL: @test_ui_si_i12_mul_nsw(
|
|
; CHECK-NEXT: [[XX:%.*]] = and i12 [[X_IN:%.*]], 31
|
|
; CHECK-NEXT: [[X:%.*]] = add nuw nsw i12 [[XX]], 1
|
|
; CHECK-NEXT: [[YY:%.*]] = and i12 [[Y_IN:%.*]], 30
|
|
; CHECK-NEXT: [[Y:%.*]] = or disjoint i12 [[YY]], 1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw nsw i12 [[X]], [[Y]]
|
|
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
|
|
; CHECK-NEXT: ret half [[R]]
|
|
;
|
|
%xx = and i12 %x_in, 31
|
|
%x = add i12 %xx, 1
|
|
%yy = and i12 %y_in, 30
|
|
%y = add i12 %yy, 1
|
|
%xf = uitofp i12 %x to half
|
|
%yf = sitofp i12 %y to half
|
|
%r = fmul half %xf, %yf
|
|
ret half %r
|
|
}
|
|
|
|
define float @test_ui_add_with_signed_constant(i32 %shr.i) {
|
|
; CHECK-LABEL: @test_ui_add_with_signed_constant(
|
|
; CHECK-NEXT: [[AND_I:%.*]] = and i32 [[SHR_I:%.*]], 32767
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nsw i32 [[AND_I]], -16383
|
|
; CHECK-NEXT: [[ADD:%.*]] = sitofp i32 [[TMP1]] to float
|
|
; CHECK-NEXT: ret float [[ADD]]
|
|
;
|
|
%and.i = and i32 %shr.i, 32767
|
|
%sub = uitofp i32 %and.i to float
|
|
%add = fadd float %sub, -16383.0
|
|
ret float %add
|
|
}
|
|
|
|
|
|
;; Reduced form of bug noticed due to #82555
|
|
define float @missed_nonzero_check_on_constant_for_si_fmul(i1 %c, i1 %.b, ptr %g_2345) {
|
|
; CHECK-LABEL: @missed_nonzero_check_on_constant_for_si_fmul(
|
|
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
|
|
; CHECK-NEXT: [[CONV_I:%.*]] = trunc nuw i32 [[SEL]] to i16
|
|
; CHECK-NEXT: [[CONV1_I:%.*]] = sitofp i16 [[CONV_I]] to float
|
|
; CHECK-NEXT: [[MUL3_I_I:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[CONV1_I]])
|
|
; CHECK-NEXT: store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
|
|
; CHECK-NEXT: ret float [[MUL3_I_I]]
|
|
;
|
|
%sel = select i1 %c, i32 65529, i32 53264
|
|
%conv.i = trunc i32 %sel to i16
|
|
%conv1.i = sitofp i16 %conv.i to float
|
|
%mul3.i.i = fmul float %conv1.i, 0.000000e+00
|
|
store i32 %sel, ptr %g_2345, align 4
|
|
ret float %mul3.i.i
|
|
}
|
|
|
|
define <2 x float> @missed_nonzero_check_on_constant_for_si_fmul_vec(i1 %c, i1 %.b, ptr %g_2345) {
|
|
; CHECK-LABEL: @missed_nonzero_check_on_constant_for_si_fmul_vec(
|
|
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
|
|
; CHECK-NEXT: [[CONV_I_S:%.*]] = trunc nuw i32 [[SEL]] to i16
|
|
; CHECK-NEXT: [[CONV_I_V:%.*]] = insertelement <2 x i16> poison, i16 [[CONV_I_S]], i64 0
|
|
; CHECK-NEXT: [[CONV_I:%.*]] = shufflevector <2 x i16> [[CONV_I_V]], <2 x i16> poison, <2 x i32> zeroinitializer
|
|
; CHECK-NEXT: [[CONV1_I:%.*]] = sitofp <2 x i16> [[CONV_I]] to <2 x float>
|
|
; CHECK-NEXT: [[MUL3_I_I:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> zeroinitializer, <2 x float> [[CONV1_I]])
|
|
; CHECK-NEXT: store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
|
|
; CHECK-NEXT: ret <2 x float> [[MUL3_I_I]]
|
|
;
|
|
%sel = select i1 %c, i32 65529, i32 53264
|
|
%conv.i.s = trunc i32 %sel to i16
|
|
%conv.i.v = insertelement <2 x i16> poison, i16 %conv.i.s, i64 0
|
|
%conv.i = insertelement <2 x i16> %conv.i.v, i16 %conv.i.s, i64 1
|
|
%conv1.i = sitofp <2 x i16> %conv.i to <2 x float>
|
|
%mul3.i.i = fmul <2 x float> %conv1.i, zeroinitializer
|
|
store i32 %sel, ptr %g_2345, align 4
|
|
ret <2 x float> %mul3.i.i
|
|
}
|
|
|
|
define float @negzero_check_on_constant_for_si_fmul(i1 %c, i1 %.b, ptr %g_2345) {
|
|
; CHECK-LABEL: @negzero_check_on_constant_for_si_fmul(
|
|
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
|
|
; CHECK-NEXT: [[CONV_I:%.*]] = trunc nuw i32 [[SEL]] to i16
|
|
; CHECK-NEXT: [[CONV1_I:%.*]] = sitofp i16 [[CONV_I]] to float
|
|
; CHECK-NEXT: [[TMP1:%.*]] = fneg float [[CONV1_I]]
|
|
; CHECK-NEXT: [[MUL3_I_I:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[TMP1]])
|
|
; CHECK-NEXT: store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
|
|
; CHECK-NEXT: ret float [[MUL3_I_I]]
|
|
;
|
|
%sel = select i1 %c, i32 65529, i32 53264
|
|
%conv.i = trunc i32 %sel to i16
|
|
%conv1.i = sitofp i16 %conv.i to float
|
|
%mul3.i.i = fmul float %conv1.i, -0.000000e+00
|
|
store i32 %sel, ptr %g_2345, align 4
|
|
ret float %mul3.i.i
|
|
}
|
|
|
|
define <2 x float> @nonzero_check_on_constant_for_si_fmul_vec_w_poison(i1 %c, i1 %.b, ptr %g_2345) {
|
|
; CHECK-LABEL: @nonzero_check_on_constant_for_si_fmul_vec_w_poison(
|
|
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
|
|
; CHECK-NEXT: [[CONV_I_S:%.*]] = trunc nuw i32 [[SEL]] to i16
|
|
; CHECK-NEXT: [[CONV_I_V:%.*]] = insertelement <2 x i16> poison, i16 [[CONV_I_S]], i64 0
|
|
; CHECK-NEXT: [[CONV_I:%.*]] = shufflevector <2 x i16> [[CONV_I_V]], <2 x i16> poison, <2 x i32> zeroinitializer
|
|
; CHECK-NEXT: [[CONV1_I:%.*]] = sitofp <2 x i16> [[CONV_I]] to <2 x float>
|
|
; CHECK-NEXT: [[MUL3_I_I:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> <float poison, float 0.000000e+00>, <2 x float> [[CONV1_I]])
|
|
; CHECK-NEXT: store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
|
|
; CHECK-NEXT: ret <2 x float> [[MUL3_I_I]]
|
|
;
|
|
%sel = select i1 %c, i32 65529, i32 53264
|
|
%conv.i.s = trunc i32 %sel to i16
|
|
%conv.i.v = insertelement <2 x i16> poison, i16 %conv.i.s, i64 0
|
|
%conv.i = insertelement <2 x i16> %conv.i.v, i16 %conv.i.s, i64 1
|
|
%conv1.i = sitofp <2 x i16> %conv.i to <2 x float>
|
|
%mul3.i.i = fmul <2 x float> %conv1.i, <float poison, float 0.000000e+00>
|
|
store i32 %sel, ptr %g_2345, align 4
|
|
ret <2 x float> %mul3.i.i
|
|
}
|
|
|
|
define <2 x float> @nonzero_check_on_constant_for_si_fmul_nz_vec_w_poison(i1 %c, i1 %.b, ptr %g_2345) {
|
|
; CHECK-LABEL: @nonzero_check_on_constant_for_si_fmul_nz_vec_w_poison(
|
|
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
|
|
; CHECK-NEXT: [[CONV_I_S:%.*]] = trunc nuw i32 [[SEL]] to i16
|
|
; CHECK-NEXT: [[CONV_I_V:%.*]] = insertelement <2 x i16> poison, i16 [[CONV_I_S]], i64 0
|
|
; CHECK-NEXT: [[CONV_I:%.*]] = shufflevector <2 x i16> [[CONV_I_V]], <2 x i16> poison, <2 x i32> zeroinitializer
|
|
; CHECK-NEXT: [[MUL3_I_I:%.*]] = sitofp <2 x i16> [[CONV_I]] to <2 x float>
|
|
; CHECK-NEXT: store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
|
|
; CHECK-NEXT: ret <2 x float> [[MUL3_I_I]]
|
|
;
|
|
%sel = select i1 %c, i32 65529, i32 53264
|
|
%conv.i.s = trunc i32 %sel to i16
|
|
%conv.i.v = insertelement <2 x i16> poison, i16 %conv.i.s, i64 0
|
|
%conv.i = insertelement <2 x i16> %conv.i.v, i16 %conv.i.s, i64 1
|
|
%conv1.i = sitofp <2 x i16> %conv.i to <2 x float>
|
|
%mul3.i.i = fmul <2 x float> %conv1.i, <float poison, float 1.000000e+00>
|
|
store i32 %sel, ptr %g_2345, align 4
|
|
ret <2 x float> %mul3.i.i
|
|
}
|
|
|
|
define <2 x float> @nonzero_check_on_constant_for_si_fmul_negz_vec_w_poison(i1 %c, i1 %.b, ptr %g_2345) {
|
|
; CHECK-LABEL: @nonzero_check_on_constant_for_si_fmul_negz_vec_w_poison(
|
|
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
|
|
; CHECK-NEXT: [[CONV_I_S:%.*]] = trunc nuw i32 [[SEL]] to i16
|
|
; CHECK-NEXT: [[CONV_I_V:%.*]] = insertelement <2 x i16> poison, i16 [[CONV_I_S]], i64 0
|
|
; CHECK-NEXT: [[CONV_I:%.*]] = shufflevector <2 x i16> [[CONV_I_V]], <2 x i16> poison, <2 x i32> zeroinitializer
|
|
; CHECK-NEXT: [[CONV1_I:%.*]] = sitofp <2 x i16> [[CONV_I]] to <2 x float>
|
|
; CHECK-NEXT: [[TMP1:%.*]] = fneg <2 x float> [[CONV1_I]]
|
|
; CHECK-NEXT: [[MUL3_I_I:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> <float poison, float -0.000000e+00>, <2 x float> [[TMP1]])
|
|
; CHECK-NEXT: store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
|
|
; CHECK-NEXT: ret <2 x float> [[MUL3_I_I]]
|
|
;
|
|
%sel = select i1 %c, i32 65529, i32 53264
|
|
%conv.i.s = trunc i32 %sel to i16
|
|
%conv.i.v = insertelement <2 x i16> poison, i16 %conv.i.s, i64 0
|
|
%conv.i = insertelement <2 x i16> %conv.i.v, i16 %conv.i.s, i64 1
|
|
%conv1.i = sitofp <2 x i16> %conv.i to <2 x float>
|
|
%mul3.i.i = fmul <2 x float> %conv1.i, <float poison, float -0.000000e+00>
|
|
store i32 %sel, ptr %g_2345, align 4
|
|
ret <2 x float> %mul3.i.i
|
|
}
|