[llvm] a98d618 - Fixed assertion in SROA if block has ho successors

Stanislav Mekhanoshin via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 11 15:15:28 PDT 2020


Author: Stanislav Mekhanoshin
Date: 2020-06-11T15:15:19-07:00
New Revision: a98d618f6e5f6429378ac1474b6df7ce1878061d

URL: https://github.com/llvm/llvm-project/commit/a98d618f6e5f6429378ac1474b6df7ce1878061d
DIFF: https://github.com/llvm/llvm-project/commit/a98d618f6e5f6429378ac1474b6df7ce1878061d.diff

LOG: Fixed assertion in SROA if block has ho successors

BasicBlock::isLegalToHoistInto() asserts if block does not
have successors. The case is degenarate but assertion still
needs to be avoided.

https://bugs.llvm.org/show_bug.cgi?id=46280

Differential Revision: https://reviews.llvm.org/D81674

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/SROA.cpp
    llvm/test/Transforms/SROA/phi-gep.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp
index bc69a1f77535..ed0ca36a4914 100644
--- a/llvm/lib/Transforms/Scalar/SROA.cpp
+++ b/llvm/lib/Transforms/Scalar/SROA.cpp
@@ -3481,6 +3481,7 @@ class AggLoadStoreRewriter : public InstVisitor<AggLoadStoreRewriter, bool> {
         llvm::any_of(PHI->incoming_values(), [](Value *In)
           { Instruction *I = dyn_cast<Instruction>(In);
             return !I || isa<GetElementPtrInst>(I) || isa<PHINode>(I) ||
+                   succ_empty(I->getParent()) ||
                    !I->getParent()->isLegalToHoistInto();
           }))
       return false;

diff  --git a/llvm/test/Transforms/SROA/phi-gep.ll b/llvm/test/Transforms/SROA/phi-gep.ll
index 5874e0f1d2ad..88c354246009 100644
--- a/llvm/test/Transforms/SROA/phi-gep.ll
+++ b/llvm/test/Transforms/SROA/phi-gep.ll
@@ -416,6 +416,42 @@ end:
   ret i32 %load
 }
 
+define void @unreachable_term() {
+; CHECK-LABEL: @unreachable_term(
+; CHECK-NEXT:    [[A_SROA_0:%.*]] = alloca i32, align 4
+; CHECK-NEXT:    [[A_SROA_0_0_A_SROA_CAST1:%.*]] = bitcast i32* [[A_SROA_0]] to [3 x i32]*
+; CHECK-NEXT:    unreachable
+; CHECK:       bb1:
+; CHECK-NEXT:    br label [[BB1_I:%.*]]
+; CHECK:       bb1.i:
+; CHECK-NEXT:    [[PHI:%.*]] = phi [3 x i32]* [ [[A_SROA_0_0_A_SROA_CAST1]], [[BB1:%.*]] ], [ null, [[BB1_I]] ]
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr [3 x i32], [3 x i32]* [[PHI]], i64 0, i64 0
+; CHECK-NEXT:    store i32 0, i32* [[GEP]], align 1
+; CHECK-NEXT:    br i1 undef, label [[BB1_I]], label [[EXIT:%.*]]
+; CHECK:       exit:
+; CHECK-NEXT:    br label [[BB2:%.*]]
+; CHECK:       bb2:
+; CHECK-NEXT:    ret void
+;
+  %a = alloca [3 x i32], align 1
+  unreachable
+
+bb1:
+  br label %bb1.i
+
+bb1.i:
+  %phi = phi [3 x i32]* [ %a, %bb1 ], [ null, %bb1.i ]
+  %gep = getelementptr [3 x i32], [3 x i32]* %phi, i64 0, i64 0
+  store i32 0, i32* %gep, align 1
+  br i1 undef, label %bb1.i, label %exit
+
+exit:
+  br label %bb2
+
+bb2:
+  ret void
+}
+
 declare %pair* @foo()
 
 declare i32 @__gxx_personality_v0(...)


        


More information about the llvm-commits mailing list