-; NOTE: Assertions have been autogenerated by update_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -instsimplify -S | FileCheck %s
;; x * 0 ==> 0 when no-nans and no-signed-zero
define float @mul_zero_1(float %a) {
; CHECK-LABEL: @mul_zero_1(
-; CHECK: ret float 0.000000e+00
+; CHECK-NEXT: ret float 0.000000e+00
;
%b = fmul nsz nnan float %a, 0.0
ret float %b
define float @mul_zero_2(float %a) {
; CHECK-LABEL: @mul_zero_2(
-; CHECK: ret float 0.000000e+00
+; CHECK-NEXT: ret float 0.000000e+00
;
%b = fmul fast float 0.0, %a
ret float %b
;; x * 0 =/=> 0 when there could be nans or -0
define float @no_mul_zero_1(float %a) {
; CHECK-LABEL: @no_mul_zero_1(
-; CHECK: [[B:%.*]] = fmul nsz float %a, 0.000000e+00
+; CHECK-NEXT: [[B:%.*]] = fmul nsz float [[A:%.*]], 0.000000e+00
; CHECK-NEXT: ret float [[B]]
;
%b = fmul nsz float %a, 0.0
define float @no_mul_zero_2(float %a) {
; CHECK-LABEL: @no_mul_zero_2(
-; CHECK: [[B:%.*]] = fmul nnan float %a, 0.000000e+00
+; CHECK-NEXT: [[B:%.*]] = fmul nnan float [[A:%.*]], 0.000000e+00
; CHECK-NEXT: ret float [[B]]
;
%b = fmul nnan float %a, 0.0
define float @no_mul_zero_3(float %a) {
; CHECK-LABEL: @no_mul_zero_3(
-; CHECK: [[B:%.*]] = fmul float %a, 0.000000e+00
+; CHECK-NEXT: [[B:%.*]] = fmul float [[A:%.*]], 0.000000e+00
; CHECK-NEXT: ret float [[B]]
;
%b = fmul float %a, 0.0
; expression
define float @fadd_fsub_0(float %a) {
; CHECK-LABEL: @fadd_fsub_0(
-; CHECK: [[NOFOLD:%.*]] = fsub float 0.000000e+00, %a
-; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd nnan float [[NOFOLD]], %a
+; CHECK-NEXT: [[NOFOLD:%.*]] = fsub float 0.000000e+00, [[A:%.*]]
+; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd nnan float [[NOFOLD]], [[A]]
; CHECK-NEXT: ret float [[NO_ZERO]]
;
; X + -X ==> 0
; fsub nnan x, x ==> 0.0
define float @fsub_x_x(float %a) {
; CHECK-LABEL: @fsub_x_x(
-; CHECK: [[NO_ZERO1:%.*]] = fsub ninf float %a, %a
-; CHECK-NEXT: [[NO_ZERO2:%.*]] = fsub float %a, %a
-; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd float [[NO_ZERO1:%.*]], [[NO_ZERO2:%.*]]
+; CHECK-NEXT: [[NO_ZERO1:%.*]] = fsub ninf float [[A:%.*]], [[A]]
+; CHECK-NEXT: [[NO_ZERO2:%.*]] = fsub float [[A]], [[A]]
+; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd float [[NO_ZERO1]], [[NO_ZERO2]]
; CHECK-NEXT: ret float [[NO_ZERO]]
;
; X - X ==> 0
; fsub nsz 0.0, (fsub 0.0, X) ==> X
define float @fsub_0_0_x(float %a) {
; CHECK-LABEL: @fsub_0_0_x(
-; CHECK: ret float %a
+; CHECK-NEXT: ret float [[A:%.*]]
;
%t1 = fsub float 0.0, %a
%ret = fsub nsz float 0.0, %t1
; fadd nsz X, 0 ==> X
define float @nofold_fadd_x_0(float %a) {
; CHECK-LABEL: @nofold_fadd_x_0(
-; CHECK: [[NO_ZERO1:%.*]] = fadd ninf float %a, 0.000000e+00
-; CHECK-NEXT: [[NO_ZERO2:%.*]] = fadd nnan float %a, 0.000000e+00
-; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd float [[NO_ZERO1:%.*]], [[NO_ZERO2:%.*]]
+; CHECK-NEXT: [[NO_ZERO1:%.*]] = fadd ninf float [[A:%.*]], 0.000000e+00
+; CHECK-NEXT: [[NO_ZERO2:%.*]] = fadd nnan float [[A]], 0.000000e+00
+; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd float [[NO_ZERO1]], [[NO_ZERO2]]
; CHECK-NEXT: ret float [[NO_ZERO]]
;
; Dont fold
; fdiv nsz nnan 0, X ==> 0
define double @fdiv_zero_by_x(double %X) {
; CHECK-LABEL: @fdiv_zero_by_x(
-; CHECK: ret double 0.000000e+00
+; CHECK-NEXT: ret double 0.000000e+00
;
; 0 / X -> 0
%r = fdiv nnan nsz double 0.0, %X
define float @fdiv_self(float %f) {
; CHECK-LABEL: @fdiv_self(
-; CHECK: ret float 1.000000e+00
+; CHECK-NEXT: ret float 1.000000e+00
;
%div = fdiv nnan float %f, %f
ret float %div
define float @fdiv_self_invalid(float %f) {
; CHECK-LABEL: @fdiv_self_invalid(
-; CHECK: [[DIV:%.*]] = fdiv float %f, %f
+; CHECK-NEXT: [[DIV:%.*]] = fdiv float [[F:%.*]], [[F]]
; CHECK-NEXT: ret float [[DIV]]
;
%div = fdiv float %f, %f
define float @fdiv_neg1(float %f) {
; CHECK-LABEL: @fdiv_neg1(
-; CHECK: ret float -1.000000e+00
+; CHECK-NEXT: ret float -1.000000e+00
;
%neg = fsub fast float -0.000000e+00, %f
%div = fdiv nnan float %neg, %f
define float @fdiv_neg2(float %f) {
; CHECK-LABEL: @fdiv_neg2(
-; CHECK: ret float -1.000000e+00
+; CHECK-NEXT: ret float -1.000000e+00
;
%neg = fsub fast float 0.000000e+00, %f
%div = fdiv nnan float %neg, %f
define float @fdiv_neg_invalid(float %f) {
; CHECK-LABEL: @fdiv_neg_invalid(
-; CHECK: [[NEG:%.*]] = fsub fast float -0.000000e+00, %f
-; CHECK-NEXT: [[DIV:%.*]] = fdiv float [[NEG]], %f
+; CHECK-NEXT: [[NEG:%.*]] = fsub fast float -0.000000e+00, [[F:%.*]]
+; CHECK-NEXT: [[DIV:%.*]] = fdiv float [[NEG]], [[F]]
; CHECK-NEXT: ret float [[DIV]]
;
%neg = fsub fast float -0.000000e+00, %f
define float @fdiv_neg_swapped1(float %f) {
; CHECK-LABEL: @fdiv_neg_swapped1(
-; CHECK: ret float -1.000000e+00
+; CHECK-NEXT: ret float -1.000000e+00
;
%neg = fsub float -0.000000e+00, %f
%div = fdiv nnan float %f, %neg
define float @fdiv_neg_swapped2(float %f) {
; CHECK-LABEL: @fdiv_neg_swapped2(
-; CHECK: ret float -1.000000e+00
+; CHECK-NEXT: ret float -1.000000e+00
;
%neg = fsub float 0.000000e+00, %f
%div = fdiv nnan float %f, %neg