From 2ee7b9349dafb9bbc2350473314fa8723efb3a43 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Thu, 8 Mar 2018 20:42:49 +0000 Subject: [PATCH] [ConstantFold] fp_binop undef, undef --> undef These are uncontroversial and independent of a proposed LangRef edits (D44216). I tried to fix tests that would fold away: rL327004 rL327028 rL327030 rL327034 I'm not sure if the Reassociate tests are meaningless yet, but they probably will be as we add more folds, so if anyone has suggestions or wants to fix those, please do. Differential Revision: https://reviews.llvm.org/D44258 llvm-svn: 327058 --- llvm/lib/IR/ConstantFold.cpp | 5 ++++- llvm/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll | 2 +- llvm/test/Transforms/InstSimplify/fp-undef.ll | 10 +++++----- llvm/test/Transforms/Reassociate/factorize-again.ll | 11 ++++++----- llvm/test/Transforms/Reassociate/fp-expr.ll | 5 +++-- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index 59818a1..f6ec12d 100644 --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -1009,7 +1009,10 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, case Instruction::FMul: case Instruction::FDiv: case Instruction::FRem: - // TODO: UNDEF handling for binary float instructions. + // [any flop] undef, undef -> undef + if (isa(C1) && isa(C2)) + return C1; + // TODO: Handle one undef operand and some other constant. return nullptr; case Instruction::BinaryOpsEnd: llvm_unreachable("Invalid BinaryOp"); diff --git a/llvm/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll b/llvm/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll index 14d495d..22d7bb2 100644 --- a/llvm/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll +++ b/llvm/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll @@ -155,7 +155,7 @@ entry: define i8 @sub_compare_folding_swapPD256_undef(<4 x double> %a, <4 x double> %b) { ; CHECK-LABEL: @sub_compare_folding_swapPD256_undef( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP:%.*]] = call <4 x i1> @llvm.x86.avx512.mask.cmp.pd.256(<4 x double> fsub (<4 x double> undef, <4 x double> undef), <4 x double> zeroinitializer, i32 5) +; CHECK-NEXT: [[TMP:%.*]] = call <4 x i1> @llvm.x86.avx512.mask.cmp.pd.256(<4 x double> undef, <4 x double> zeroinitializer, i32 5) ; CHECK-NEXT: [[TMP0:%.*]] = shufflevector <4 x i1> [[TMP]], <4 x i1> zeroinitializer, <8 x i32> ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i1> [[TMP0]] to i8 ; CHECK-NEXT: ret i8 [[TMP1]] diff --git a/llvm/test/Transforms/InstSimplify/fp-undef.ll b/llvm/test/Transforms/InstSimplify/fp-undef.ll index 3304aa7..89a8d1c 100644 --- a/llvm/test/Transforms/InstSimplify/fp-undef.ll +++ b/llvm/test/Transforms/InstSimplify/fp-undef.ll @@ -179,7 +179,7 @@ define float @frem_undef_op1_fast(float %x) { define double @fadd_undef_undef(double %x) { ; CHECK-LABEL: @fadd_undef_undef( -; CHECK-NEXT: ret double fadd (double undef, double undef) +; CHECK-NEXT: ret double undef ; %r = fadd double undef, undef ret double %r @@ -187,7 +187,7 @@ define double @fadd_undef_undef(double %x) { define double @fsub_undef_undef(double %x) { ; CHECK-LABEL: @fsub_undef_undef( -; CHECK-NEXT: ret double fsub (double undef, double undef) +; CHECK-NEXT: ret double undef ; %r = fsub double undef, undef ret double %r @@ -195,7 +195,7 @@ define double @fsub_undef_undef(double %x) { define double @fmul_undef_undef(double %x) { ; CHECK-LABEL: @fmul_undef_undef( -; CHECK-NEXT: ret double fmul (double undef, double undef) +; CHECK-NEXT: ret double undef ; %r = fmul double undef, undef ret double %r @@ -203,7 +203,7 @@ define double @fmul_undef_undef(double %x) { define double @fdiv_undef_undef(double %x) { ; CHECK-LABEL: @fdiv_undef_undef( -; CHECK-NEXT: ret double fdiv (double undef, double undef) +; CHECK-NEXT: ret double undef ; %r = fdiv double undef, undef ret double %r @@ -211,7 +211,7 @@ define double @fdiv_undef_undef(double %x) { define double @frem_undef_undef(double %x) { ; CHECK-LABEL: @frem_undef_undef( -; CHECK-NEXT: ret double frem (double undef, double undef) +; CHECK-NEXT: ret double undef ; %r = frem double undef, undef ret double %r diff --git a/llvm/test/Transforms/Reassociate/factorize-again.ll b/llvm/test/Transforms/Reassociate/factorize-again.ll index e50860b..d86fbf4 100644 --- a/llvm/test/Transforms/Reassociate/factorize-again.ll +++ b/llvm/test/Transforms/Reassociate/factorize-again.ll @@ -1,15 +1,16 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -reassociate < %s | FileCheck %s define void @main(float, float) { ; CHECK-LABEL: @main( ; CHECK-NEXT: wrapper_entry: -; CHECK-NEXT: [[TMP2:%.*]] = fsub float undef, %0 -; CHECK-NEXT: [[TMP3:%.*]] = fsub float undef, %1 +; CHECK-NEXT: [[TMP2:%.*]] = fsub float undef, [[TMP0:%.*]] +; CHECK-NEXT: [[TMP3:%.*]] = fsub float undef, [[TMP1:%.*]] ; CHECK-NEXT: [[TMP4:%.*]] = call float @llvm.rsqrt.f32(float undef) ; CHECK-NEXT: [[REASS_ADD2:%.*]] = fadd fast float [[TMP3]], [[TMP2]] -; CHECK-NEXT: [[REASS_MUL3:%.*]] = fmul fast float [[REASS_ADD2]], undef -; CHECK-NEXT: [[REASS_ADD1:%.*]] = fadd fast float [[REASS_MUL3]], fmul (float undef, float undef) -; CHECK-NEXT: [[REASS_MUL:%.*]] = fmul fast float [[REASS_ADD1]], [[TMP4]] +; CHECK-NEXT: [[REASS_MUL3:%.*]] = fmul fast float [[TMP4]], [[REASS_ADD2]] +; CHECK-NEXT: [[REASS_ADD1:%.*]] = fadd fast float [[REASS_MUL3]], [[TMP4]] +; CHECK-NEXT: [[REASS_MUL:%.*]] = fmul fast float [[REASS_ADD1]], undef ; CHECK-NEXT: [[TMP5:%.*]] = call float @foo2(float [[REASS_MUL]], float 0.000000e+00) ; CHECK-NEXT: [[MUL36:%.*]] = fmul fast float [[TMP5]], 1.500000e+00 ; CHECK-NEXT: call void @foo1(i32 4, float [[MUL36]]) diff --git a/llvm/test/Transforms/Reassociate/fp-expr.ll b/llvm/test/Transforms/Reassociate/fp-expr.ll index d0ad555..e616c52 100644 --- a/llvm/test/Transforms/Reassociate/fp-expr.ll +++ b/llvm/test/Transforms/Reassociate/fp-expr.ll @@ -1,10 +1,11 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -reassociate < %s | FileCheck %s define void @test1() { ; CHECK-LABEL: @test1( ; CHECK-NEXT: [[T1:%.*]] = tail call <4 x float> @blam() ; CHECK-NEXT: [[T1_NEG:%.*]] = fsub fast <4 x float> , [[T1]] -; CHECK-NEXT: [[T24:%.*]] = fadd fast <4 x float> [[T1_NEG]], fadd (<4 x float> undef, <4 x float> undef) +; CHECK-NEXT: [[T24:%.*]] = fadd fast <4 x float> [[T1_NEG]], undef ; CHECK-NEXT: tail call void @wombat(<4 x float> [[T24]]) ; CHECK-NEXT: ret void ; @@ -19,7 +20,7 @@ define half @test2() { ; CHECK-LABEL: @test2( ; CHECK-NEXT: [[T15:%.*]] = fsub fast half undef, undef ; CHECK-NEXT: [[T15_NEG:%.*]] = fsub fast half 0xH8000, [[T15]] -; CHECK-NEXT: [[T18:%.*]] = fadd fast half [[T15_NEG]], fadd (half undef, half undef) +; CHECK-NEXT: [[T18:%.*]] = fadd fast half [[T15_NEG]], undef ; CHECK-NEXT: ret half [[T18]] ; %t15 = fsub fast half undef, undef -- 2.7.4