[llvm] r321515 - [InstCombine] Check for isa<Instruction> before using cast<>

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 28 01:35:36 PST 2017


Author: rksimon
Date: Thu Dec 28 01:35:35 2017
New Revision: 321515

URL: http://llvm.org/viewvc/llvm-project?rev=321515&view=rev
Log:
[InstCombine] Check for isa<Instruction> before using cast<>

Protects against casts from constexpr etc.

Reduced from oss-fuzz #4788 test case

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
    llvm/trunk/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=321515&r1=321514&r2=321515&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Thu Dec 28 01:35:35 2017
@@ -2376,7 +2376,7 @@ Instruction *InstCombiner::visitCallInst
     // The compare intrinsic uses the above assumptions and therefore
     // doesn't require additional flags.
     if ((match(Arg0, m_OneUse(m_FSub(m_Value(A), m_Value(B)))) &&
-         match(Arg1, m_Zero()) &&
+         match(Arg1, m_Zero()) && isa<Instruction>(Arg0) &&
          cast<Instruction>(Arg0)->getFastMathFlags().noInfs())) {
       if (Arg0IsZero)
         std::swap(A, B);

Modified: llvm/trunk/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll?rev=321515&r1=321514&r2=321515&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll Thu Dec 28 01:35:35 2017
@@ -122,6 +122,19 @@ 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:%.*]] = tail call i8 @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, i8 -1)
+; CHECK-NEXT:    ret i8 [[TMP]]
+;
+entry:
+  %sub.i1 = fsub ninf <4 x double> undef, undef
+  %tmp = tail call i8 @llvm.x86.avx512.mask.cmp.pd.256(<4 x double> %sub.i1, <4 x double> zeroinitializer, i32 5, i8 -1)
+  ret i8 %tmp
+}
+
+
 define i8 @sub_compare_folding_swapPD512(<8 x double> %a, <8 x double> %b){
 ; CHECK-LABEL: @sub_compare_folding_swapPD512(
 ; CHECK-NEXT:  entry:




More information about the llvm-commits mailing list