forked from OSchip/llvm-project
				
			[AssumeBundles] fix crashes
Summary: this patch fixe crash/asserts found in the test-suite. the AssumeptionCache cannot be assumed to have all assumes contrary to what i tought. prevent generation of information for terminators, because this can create broken IR in transfromation where we insert the new terminator before removing the old one. Reviewers: jdoerfert Reviewed By: jdoerfert Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D79458
This commit is contained in:
		
							parent
							
								
									da100de0a6
								
							
						
					
					
						commit
						78d85c2091
					
				| 
						 | 
					@ -152,10 +152,6 @@ llvm::getKnowledgeForValue(const Value *V,
 | 
				
			||||||
                                             const CallBase::BundleOpInfo *)>
 | 
					                                             const CallBase::BundleOpInfo *)>
 | 
				
			||||||
                               Filter) {
 | 
					                               Filter) {
 | 
				
			||||||
  if (AC) {
 | 
					  if (AC) {
 | 
				
			||||||
#ifndef NDEBUG
 | 
					 | 
				
			||||||
    RetainedKnowledge RKCheck =
 | 
					 | 
				
			||||||
        getKnowledgeForValue(V, AttrKinds, nullptr, Filter);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    for (AssumptionCache::ResultElem &Elem : AC->assumptionsFor(V)) {
 | 
					    for (AssumptionCache::ResultElem &Elem : AC->assumptionsFor(V)) {
 | 
				
			||||||
      IntrinsicInst *II = cast_or_null<IntrinsicInst>(Elem.Assume);
 | 
					      IntrinsicInst *II = cast_or_null<IntrinsicInst>(Elem.Assume);
 | 
				
			||||||
      if (!II || Elem.Index == AssumptionCache::ExprResultIdx)
 | 
					      if (!II || Elem.Index == AssumptionCache::ExprResultIdx)
 | 
				
			||||||
| 
						 | 
					@ -163,12 +159,9 @@ llvm::getKnowledgeForValue(const Value *V,
 | 
				
			||||||
      if (RetainedKnowledge RK = getKnowledgeFromBundle(
 | 
					      if (RetainedKnowledge RK = getKnowledgeFromBundle(
 | 
				
			||||||
              *II, II->bundle_op_info_begin()[Elem.Index]))
 | 
					              *II, II->bundle_op_info_begin()[Elem.Index]))
 | 
				
			||||||
        if (is_contained(AttrKinds, RK.AttrKind) &&
 | 
					        if (is_contained(AttrKinds, RK.AttrKind) &&
 | 
				
			||||||
            Filter(RK, II, &II->bundle_op_info_begin()[Elem.Index])) {
 | 
					            Filter(RK, II, &II->bundle_op_info_begin()[Elem.Index]))
 | 
				
			||||||
          assert(!!RKCheck && "invalid Assumption cache");
 | 
					 | 
				
			||||||
          return RK;
 | 
					          return RK;
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    assert(!RKCheck && "invalid Assumption cache");
 | 
					 | 
				
			||||||
    return RetainedKnowledge::none();
 | 
					    return RetainedKnowledge::none();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  for (auto &U : V->uses()) {
 | 
					  for (auto &U : V->uses()) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -201,8 +201,9 @@ IntrinsicInst *llvm::buildAssumeFromInst(Instruction *I) {
 | 
				
			||||||
  return Builder.build();
 | 
					  return Builder.build();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void llvm::salvageKnowledge(Instruction *I, AssumptionCache *AC, DominatorTree* DT) {
 | 
					void llvm::salvageKnowledge(Instruction *I, AssumptionCache *AC,
 | 
				
			||||||
  if (!EnableKnowledgeRetention)
 | 
					                            DominatorTree *DT) {
 | 
				
			||||||
 | 
					  if (!EnableKnowledgeRetention || I->isTerminator())
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  AssumeBuilderState Builder(I->getModule(), I, AC, DT);
 | 
					  AssumeBuilderState Builder(I->getModule(), I, AC, DT);
 | 
				
			||||||
  Builder.addInstruction(I);
 | 
					  Builder.addInstruction(I);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -901,3 +901,81 @@ define dso_local i32 @test4A(i32* %0, i32* %1, i32 %2, i32 %3) {
 | 
				
			||||||
12:                                               ; preds = %6, %4
 | 
					12:                                               ; preds = %6, %4
 | 
				
			||||||
  ret i32 0
 | 
					  ret i32 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare void @may_throwv2(i32* %P)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define dso_local i32 @terminator(i32* %P) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
 | 
				
			||||||
 | 
					; BASIC-LABEL: define {{[^@]+}}@terminator
 | 
				
			||||||
 | 
					; BASIC-SAME: (i32* [[P:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
 | 
				
			||||||
 | 
					; BASIC-NEXT:    invoke void @may_throwv2(i32* nonnull [[P]])
 | 
				
			||||||
 | 
					; BASIC-NEXT:    to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
 | 
				
			||||||
 | 
					; BASIC:       Catch:
 | 
				
			||||||
 | 
					; BASIC-NEXT:    [[V:%.*]] = landingpad { i8*, i32 }
 | 
				
			||||||
 | 
					; BASIC-NEXT:    catch i8* null
 | 
				
			||||||
 | 
					; BASIC-NEXT:    br label [[EXIT]]
 | 
				
			||||||
 | 
					; BASIC:       Exit:
 | 
				
			||||||
 | 
					; BASIC-NEXT:    [[DOT0:%.*]] = phi i32 [ 1, [[TMP0:%.*]] ], [ 0, [[CATCH]] ]
 | 
				
			||||||
 | 
					; BASIC-NEXT:    ret i32 [[DOT0]]
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; ALL-LABEL: define {{[^@]+}}@terminator
 | 
				
			||||||
 | 
					; ALL-SAME: (i32* [[P:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
 | 
				
			||||||
 | 
					; ALL-NEXT:    invoke void @may_throwv2(i32* nonnull [[P]])
 | 
				
			||||||
 | 
					; ALL-NEXT:    to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
 | 
				
			||||||
 | 
					; ALL:       Catch:
 | 
				
			||||||
 | 
					; ALL-NEXT:    [[V:%.*]] = landingpad { i8*, i32 }
 | 
				
			||||||
 | 
					; ALL-NEXT:    catch i8* null
 | 
				
			||||||
 | 
					; ALL-NEXT:    br label [[EXIT]]
 | 
				
			||||||
 | 
					; ALL:       Exit:
 | 
				
			||||||
 | 
					; ALL-NEXT:    [[DOT0:%.*]] = phi i32 [ 1, [[TMP0:%.*]] ], [ 0, [[CATCH]] ]
 | 
				
			||||||
 | 
					; ALL-NEXT:    ret i32 [[DOT0]]
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; WITH-AC-LABEL: define {{[^@]+}}@terminator
 | 
				
			||||||
 | 
					; WITH-AC-SAME: (i32* [[P:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
 | 
				
			||||||
 | 
					; WITH-AC-NEXT:    invoke void @may_throwv2(i32* nonnull [[P]])
 | 
				
			||||||
 | 
					; WITH-AC-NEXT:    to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
 | 
				
			||||||
 | 
					; WITH-AC:       Catch:
 | 
				
			||||||
 | 
					; WITH-AC-NEXT:    [[V:%.*]] = landingpad { i8*, i32 }
 | 
				
			||||||
 | 
					; WITH-AC-NEXT:    catch i8* null
 | 
				
			||||||
 | 
					; WITH-AC-NEXT:    br label [[EXIT]]
 | 
				
			||||||
 | 
					; WITH-AC:       Exit:
 | 
				
			||||||
 | 
					; WITH-AC-NEXT:    [[DOT0:%.*]] = phi i32 [ 1, [[TMP0:%.*]] ], [ 0, [[CATCH]] ]
 | 
				
			||||||
 | 
					; WITH-AC-NEXT:    ret i32 [[DOT0]]
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CROSS-BLOCK-LABEL: define {{[^@]+}}@terminator
 | 
				
			||||||
 | 
					; CROSS-BLOCK-SAME: (i32* [[P:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
 | 
				
			||||||
 | 
					; CROSS-BLOCK-NEXT:    invoke void @may_throwv2(i32* nonnull [[P]])
 | 
				
			||||||
 | 
					; CROSS-BLOCK-NEXT:    to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
 | 
				
			||||||
 | 
					; CROSS-BLOCK:       Catch:
 | 
				
			||||||
 | 
					; CROSS-BLOCK-NEXT:    [[V:%.*]] = landingpad { i8*, i32 }
 | 
				
			||||||
 | 
					; CROSS-BLOCK-NEXT:    catch i8* null
 | 
				
			||||||
 | 
					; CROSS-BLOCK-NEXT:    br label [[EXIT]]
 | 
				
			||||||
 | 
					; CROSS-BLOCK:       Exit:
 | 
				
			||||||
 | 
					; CROSS-BLOCK-NEXT:    [[DOT0:%.*]] = phi i32 [ 1, [[TMP0:%.*]] ], [ 0, [[CATCH]] ]
 | 
				
			||||||
 | 
					; CROSS-BLOCK-NEXT:    ret i32 [[DOT0]]
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-LABEL: define {{[^@]+}}@terminator
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-SAME: (i32* [[P:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-NEXT:    invoke void @may_throwv2(i32* nonnull [[P]])
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-NEXT:    to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY:       Catch:
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-NEXT:    [[V:%.*]] = landingpad { i8*, i32 }
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-NEXT:    catch i8* null
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-NEXT:    br label [[EXIT]]
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY:       Exit:
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-NEXT:    [[DOT0:%.*]] = phi i32 [ 1, [[TMP0:%.*]] ], [ 0, [[CATCH]] ]
 | 
				
			||||||
 | 
					; FULL-SIMPLIFY-NEXT:    ret i32 [[DOT0]]
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					  invoke void @may_throwv2(i32* nonnull %P)
 | 
				
			||||||
 | 
					  to label %Exit unwind label %Catch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Catch:                                                ; preds = %0
 | 
				
			||||||
 | 
					  %v = landingpad { i8*, i32 }
 | 
				
			||||||
 | 
					  catch i8* null
 | 
				
			||||||
 | 
					  br label %Exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Exit:                                                ; preds = %7, %5
 | 
				
			||||||
 | 
					  %.0 = phi i32 [ 1, %0 ], [ 0, %Catch ]
 | 
				
			||||||
 | 
					  ret i32 %.0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare dso_local i32 @__gxx_personality_v0(...)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue