[llvm] 4a4e44e - [InstCombine] add test for loop-invariant fdiv; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 14 14:51:13 PST 2023
Author: Sanjay Patel
Date: 2023-02-14T17:51:06-05:00
New Revision: 4a4e44e378ca4a9b0b82c208bc324b50fef5676e
URL: https://github.com/llvm/llvm-project/commit/4a4e44e378ca4a9b0b82c208bc324b50fef5676e
DIFF: https://github.com/llvm/llvm-project/commit/4a4e44e378ca4a9b0b82c208bc324b50fef5676e.diff
LOG: [InstCombine] add test for loop-invariant fdiv; NFC
Adding baseline test based on D87479, so we know
current state and limitations of a potential fix.
Added:
Modified:
llvm/test/Transforms/InstCombine/fmul.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/fmul.ll b/llvm/test/Transforms/InstCombine/fmul.ll
index 6d2a65a418af0..5e6db8f964eb4 100644
--- a/llvm/test/Transforms/InstCombine/fmul.ll
+++ b/llvm/test/Transforms/InstCombine/fmul.ll
@@ -1051,6 +1051,42 @@ define float @fmul_fdiv_factor_extra_use(float %x, float %y) {
ret float %mul
}
+define void @fmul_loop_invariant_fdiv(float* %a, float %x) {
+; CHECK-LABEL: @fmul_loop_invariant_fdiv(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[FOR_BODY:%.*]]
+; CHECK: for.cond.cleanup:
+; CHECK-NEXT: ret void
+; CHECK: for.body:
+; CHECK-NEXT: [[I_08:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
+; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[I_08]] to i64
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A:%.*]], i64 [[IDXPROM]]
+; CHECK-NEXT: [[F:%.*]] = load float, ptr [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[M:%.*]] = fdiv fast float [[F]], [[X:%.*]]
+; CHECK-NEXT: store float [[M]], ptr [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_08]], 1
+; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], 1024
+; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
+;
+entry:
+ %d = fdiv fast float 1.0, %x
+ br label %for.body
+
+for.cond.cleanup:
+ ret void
+
+for.body:
+ %i.08 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
+ %idxprom = zext i32 %i.08 to i64
+ %arrayidx = getelementptr inbounds float, float* %a, i64 %idxprom
+ %f = load float, float* %arrayidx, align 4
+ %m = fmul fast float %f, %d
+ store float %m, float* %arrayidx, align 4
+ %inc = add nuw nsw i32 %i.08, 1
+ %cmp.not = icmp eq i32 %inc, 1024
+ br i1 %cmp.not, label %for.cond.cleanup, label %for.body
+}
+
; Avoid infinite looping by moving negation out of a constant expression.
@g = external global {[2 x ptr]}, align 1
@@ -1069,8 +1105,8 @@ define double @fmul_negated_constant_expression(double %x) {
define float @negate_if_true(float %x, i1 %cond) {
; CHECK-LABEL: @negate_if_true(
; CHECK-NEXT: [[TMP1:%.*]] = fneg float [[X:%.*]]
-; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[COND:%.*]], float [[TMP1]], float [[X]]
-; CHECK-NEXT: ret float [[TMP2]]
+; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], float [[TMP1]], float [[X]]
+; CHECK-NEXT: ret float [[R]]
;
%sel = select i1 %cond, float -1.0, float 1.0
%r = fmul float %sel, %x
@@ -1080,8 +1116,8 @@ define float @negate_if_true(float %x, i1 %cond) {
define float @negate_if_false(float %x, i1 %cond) {
; CHECK-LABEL: @negate_if_false(
; CHECK-NEXT: [[TMP1:%.*]] = fneg arcp float [[X:%.*]]
-; CHECK-NEXT: [[TMP2:%.*]] = select arcp i1 [[COND:%.*]], float [[X]], float [[TMP1]]
-; CHECK-NEXT: ret float [[TMP2]]
+; CHECK-NEXT: [[R:%.*]] = select arcp i1 [[COND:%.*]], float [[X]], float [[TMP1]]
+; CHECK-NEXT: ret float [[R]]
;
%sel = select i1 %cond, float 1.0, float -1.0
%r = fmul arcp float %sel, %x
@@ -1092,8 +1128,8 @@ define <2 x double> @negate_if_true_commute(<2 x double> %px, i1 %cond) {
; CHECK-LABEL: @negate_if_true_commute(
; CHECK-NEXT: [[X:%.*]] = fdiv <2 x double> <double 4.200000e+01, double 4.200000e+01>, [[PX:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = fneg ninf <2 x double> [[X]]
-; CHECK-NEXT: [[TMP2:%.*]] = select ninf i1 [[COND:%.*]], <2 x double> [[TMP1]], <2 x double> [[X]]
-; CHECK-NEXT: ret <2 x double> [[TMP2]]
+; CHECK-NEXT: [[R:%.*]] = select ninf i1 [[COND:%.*]], <2 x double> [[TMP1]], <2 x double> [[X]]
+; CHECK-NEXT: ret <2 x double> [[R]]
;
%x = fdiv <2 x double> <double 42.0, double 42.0>, %px ; thwart complexity-based canonicalization
%sel = select i1 %cond, <2 x double> <double -1.0, double -1.0>, <2 x double> <double 1.0, double 1.0>
@@ -1105,8 +1141,8 @@ define <2 x double> @negate_if_false_commute(<2 x double> %px, <2 x i1> %cond) {
; CHECK-LABEL: @negate_if_false_commute(
; CHECK-NEXT: [[X:%.*]] = fdiv <2 x double> <double 4.200000e+01, double 5.100000e+00>, [[PX:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = fneg <2 x double> [[X]]
-; CHECK-NEXT: [[TMP2:%.*]] = select <2 x i1> [[COND:%.*]], <2 x double> [[X]], <2 x double> [[TMP1]]
-; CHECK-NEXT: ret <2 x double> [[TMP2]]
+; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[COND:%.*]], <2 x double> [[X]], <2 x double> [[TMP1]]
+; CHECK-NEXT: ret <2 x double> [[R]]
;
%x = fdiv <2 x double> <double 42.0, double 5.1>, %px ; thwart complexity-based canonicalization
%sel = select <2 x i1> %cond, <2 x double> <double 1.0, double 1.0>, <2 x double> <double -1.0, double -1.0>
@@ -1203,8 +1239,8 @@ define <vscale x 2 x float> @mul_scalable_splat_zero(<vscale x 2 x float> %z) {
define half @mul_zero_nnan(half %x) {
; CHECK-LABEL: @mul_zero_nnan(
-; CHECK-NEXT: [[TMP1:%.*]] = call nnan half @llvm.copysign.f16(half 0xH0000, half [[X:%.*]])
-; CHECK-NEXT: ret half [[TMP1]]
+; CHECK-NEXT: [[R:%.*]] = call nnan half @llvm.copysign.f16(half 0xH0000, half [[X:%.*]])
+; CHECK-NEXT: ret half [[R]]
;
%r = fmul nnan half %x, 0.0
ret half %r
@@ -1214,8 +1250,8 @@ define half @mul_zero_nnan(half %x) {
define <2 x float> @mul_zero_nnan_vec_poison(<2 x float> %x) {
; CHECK-LABEL: @mul_zero_nnan_vec_poison(
-; CHECK-NEXT: [[TMP1:%.*]] = call nnan <2 x float> @llvm.copysign.v2f32(<2 x float> <float 0.000000e+00, float poison>, <2 x float> [[X:%.*]])
-; CHECK-NEXT: ret <2 x float> [[TMP1]]
+; CHECK-NEXT: [[R:%.*]] = call nnan <2 x float> @llvm.copysign.v2f32(<2 x float> <float 0.000000e+00, float poison>, <2 x float> [[X:%.*]])
+; CHECK-NEXT: ret <2 x float> [[R]]
;
%r = fmul nnan <2 x float> %x, <float 0.0, float poison>
ret <2 x float> %r
More information about the llvm-commits
mailing list