forked from OSchip/llvm-project
Revert "[WPD/LowerTypeTests] Delay lowering/removal of type tests until after ICP"
This reverts commit 748bb5a0f1
.
Due to Chromium CFI+ThinLTO test crashes reported on patch.
This commit is contained in:
parent
ccf900fc93
commit
25aa2eef99
|
@ -833,8 +833,7 @@ struct TypeTestResolution {
|
|||
Single, ///< Single element (last example in "Short Inline Bit Vectors")
|
||||
AllOnes, ///< All-ones bit vector ("Eliminating Bit Vector Checks for
|
||||
/// All-Ones Bit Vectors")
|
||||
Unknown, ///< Unknown (analysis not performed, don't lower)
|
||||
} TheKind = Unknown;
|
||||
} TheKind = Unsat;
|
||||
|
||||
/// Range of size-1 expressed as a bit width. For example, if the size is in
|
||||
/// range [1,256], this number will be 8. This helps generate the most compact
|
||||
|
@ -1027,7 +1026,7 @@ public:
|
|||
// in the way some record are interpreted, like flags for instance.
|
||||
// Note that incrementing this may require changes in both BitcodeReader.cpp
|
||||
// and BitcodeWriter.cpp.
|
||||
static constexpr uint64_t BitcodeSummaryVersion = 9;
|
||||
static constexpr uint64_t BitcodeSummaryVersion = 8;
|
||||
|
||||
// Regular LTO module name for ASM writer
|
||||
static constexpr const char *getRegularLTOModuleName() {
|
||||
|
|
|
@ -17,7 +17,6 @@ namespace yaml {
|
|||
|
||||
template <> struct ScalarEnumerationTraits<TypeTestResolution::Kind> {
|
||||
static void enumeration(IO &io, TypeTestResolution::Kind &value) {
|
||||
io.enumCase(value, "Unknown", TypeTestResolution::Unknown);
|
||||
io.enumCase(value, "Unsat", TypeTestResolution::Unsat);
|
||||
io.enumCase(value, "ByteArray", TypeTestResolution::ByteArray);
|
||||
io.enumCase(value, "Inline", TypeTestResolution::Inline);
|
||||
|
|
|
@ -7660,9 +7660,6 @@ bool LLParser::ParseTypeTestResolution(TypeTestResolution &TTRes) {
|
|||
return true;
|
||||
|
||||
switch (Lex.getKind()) {
|
||||
case lltok::kw_unknown:
|
||||
TTRes.TheKind = TypeTestResolution::Unknown;
|
||||
break;
|
||||
case lltok::kw_unsat:
|
||||
TTRes.TheKind = TypeTestResolution::Unsat;
|
||||
break;
|
||||
|
|
|
@ -2772,8 +2772,6 @@ static const char *getWholeProgDevirtResByArgKindName(
|
|||
|
||||
static const char *getTTResKindName(TypeTestResolution::Kind K) {
|
||||
switch (K) {
|
||||
case TypeTestResolution::Unknown:
|
||||
return "unknown";
|
||||
case TypeTestResolution::Unsat:
|
||||
return "unsat";
|
||||
case TypeTestResolution::ByteArray:
|
||||
|
|
|
@ -748,12 +748,6 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
|
|||
true /* SamplePGO */));
|
||||
}
|
||||
|
||||
// Lower type metadata and the type.test intrinsic in the ThinLTO
|
||||
// post link pipeline after ICP. This is to enable usage of the type
|
||||
// tests in ICP sequences.
|
||||
if (Phase == ThinLTOPhase::PostLink)
|
||||
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
|
||||
|
||||
// Interprocedural constant propagation now that basic cleanup has occurred
|
||||
// and prior to optimizing globals.
|
||||
// FIXME: This position in the pipeline hasn't been carefully considered in
|
||||
|
@ -1176,9 +1170,6 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level, bool DebugLogging,
|
|||
// metadata and intrinsics.
|
||||
MPM.addPass(WholeProgramDevirtPass(ExportSummary, nullptr));
|
||||
MPM.addPass(LowerTypeTestsPass(ExportSummary, nullptr));
|
||||
// Run a second time to clean up any type tests left behind by WPD for use
|
||||
// in ICP.
|
||||
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
|
||||
return MPM;
|
||||
}
|
||||
|
||||
|
@ -1245,10 +1236,6 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level, bool DebugLogging,
|
|||
// The LowerTypeTestsPass needs to run to lower type metadata and the
|
||||
// type.test intrinsics. The pass does nothing if CFI is disabled.
|
||||
MPM.addPass(LowerTypeTestsPass(ExportSummary, nullptr));
|
||||
// Run a second time to clean up any type tests left behind by WPD for use
|
||||
// in ICP (which is performed earlier than this in the regular LTO
|
||||
// pipeline).
|
||||
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
|
||||
return MPM;
|
||||
}
|
||||
|
||||
|
@ -1376,9 +1363,6 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level, bool DebugLogging,
|
|||
// to be run at link time if CFI is enabled. This pass does nothing if
|
||||
// CFI is disabled.
|
||||
MPM.addPass(LowerTypeTestsPass(ExportSummary, nullptr));
|
||||
// Run a second time to clean up any type tests left behind by WPD for use
|
||||
// in ICP (which is performed earlier than this in the regular LTO pipeline).
|
||||
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
|
||||
|
||||
// Enable splitting late in the FullLTO post-link pipeline. This is done in
|
||||
// the same stage in the old pass manager (\ref addLateLTOOptimizationPasses).
|
||||
|
|
|
@ -735,9 +735,6 @@ static bool isKnownTypeIdMember(Metadata *TypeId, const DataLayout &DL,
|
|||
/// replace the call with.
|
||||
Value *LowerTypeTestsModule::lowerTypeTestCall(Metadata *TypeId, CallInst *CI,
|
||||
const TypeIdLowering &TIL) {
|
||||
// Delay lowering if the resolution is currently unknown.
|
||||
if (TIL.TheKind == TypeTestResolution::Unknown)
|
||||
return nullptr;
|
||||
if (TIL.TheKind == TypeTestResolution::Unsat)
|
||||
return ConstantInt::getFalse(M.getContext());
|
||||
|
||||
|
@ -1046,10 +1043,8 @@ void LowerTypeTestsModule::importTypeTest(CallInst *CI) {
|
|||
|
||||
TypeIdLowering TIL = importTypeId(TypeIdStr->getString());
|
||||
Value *Lowered = lowerTypeTestCall(TypeIdStr, CI, TIL);
|
||||
if (Lowered) {
|
||||
CI->replaceAllUsesWith(Lowered);
|
||||
CI->eraseFromParent();
|
||||
}
|
||||
CI->replaceAllUsesWith(Lowered);
|
||||
CI->eraseFromParent();
|
||||
}
|
||||
|
||||
// ThinLTO backend: the function F has a jump table entry; update this module
|
||||
|
@ -1172,10 +1167,8 @@ void LowerTypeTestsModule::lowerTypeTestCalls(
|
|||
for (CallInst *CI : TIUI.CallSites) {
|
||||
++NumTypeTestCallsLowered;
|
||||
Value *Lowered = lowerTypeTestCall(TypeId, CI, TIL);
|
||||
if (Lowered) {
|
||||
CI->replaceAllUsesWith(Lowered);
|
||||
CI->eraseFromParent();
|
||||
}
|
||||
CI->replaceAllUsesWith(Lowered);
|
||||
CI->eraseFromParent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -503,7 +503,6 @@ void PassManagerBuilder::populateModulePassManager(
|
|||
MPM.add(createBarrierNoopPass());
|
||||
|
||||
if (PerformThinLTO) {
|
||||
MPM.add(createLowerTypeTestsPass(nullptr, nullptr, true));
|
||||
// Drop available_externally and unreferenced globals. This is necessary
|
||||
// with ThinLTO in order to avoid leaving undefined references to dead
|
||||
// globals in the object file.
|
||||
|
@ -537,11 +536,9 @@ void PassManagerBuilder::populateModulePassManager(
|
|||
// inter-module indirect calls. For that we perform indirect call promotion
|
||||
// earlier in the pass pipeline, here before globalopt. Otherwise imported
|
||||
// available_externally functions look unreferenced and are removed.
|
||||
if (PerformThinLTO) {
|
||||
if (PerformThinLTO)
|
||||
MPM.add(createPGOIndirectCallPromotionLegacyPass(/*InLTO = */ true,
|
||||
!PGOSampleUse.empty()));
|
||||
MPM.add(createLowerTypeTestsPass(nullptr, nullptr, true));
|
||||
}
|
||||
|
||||
// For SamplePGO in ThinLTO compile phase, we do not want to unroll loops
|
||||
// as it will change the CFG too much to make the 2nd profile annotation
|
||||
|
@ -1041,8 +1038,8 @@ void PassManagerBuilder::populateThinLTOPassManager(
|
|||
PM.add(createVerifierPass());
|
||||
|
||||
if (ImportSummary) {
|
||||
// This pass imports type identifier resolutions for whole-program
|
||||
// devirtualization and CFI. It must run early because other passes may
|
||||
// These passes import type identifier resolutions for whole-program
|
||||
// devirtualization and CFI. They must run early because other passes may
|
||||
// disturb the specific instruction patterns that these passes look for,
|
||||
// creating dependencies on resolutions that may not appear in the summary.
|
||||
//
|
||||
|
@ -1090,9 +1087,6 @@ void PassManagerBuilder::populateLTOPassManager(legacy::PassManagerBase &PM) {
|
|||
// control flow integrity mechanisms (-fsanitize=cfi*) and needs to run at
|
||||
// link time if CFI is enabled. The pass does nothing if CFI is disabled.
|
||||
PM.add(createLowerTypeTestsPass(ExportSummary, nullptr));
|
||||
// Run a second time to clean up any type tests left behind by WPD for use
|
||||
// in ICP (which is performed earlier than this in the regular LTO pipeline).
|
||||
PM.add(createLowerTypeTestsPass(nullptr, nullptr, true));
|
||||
|
||||
if (OptLevel != 0)
|
||||
addLateLTOOptimizationPasses(PM);
|
||||
|
|
|
@ -510,9 +510,7 @@ struct DevirtModule {
|
|||
|
||||
bool areRemarksEnabled();
|
||||
|
||||
void
|
||||
scanTypeTestUsers(Function *TypeTestFunc,
|
||||
DenseMap<Metadata *, std::set<TypeMemberInfo>> &TypeIdMap);
|
||||
void scanTypeTestUsers(Function *TypeTestFunc);
|
||||
void scanTypeCheckedLoadUsers(Function *TypeCheckedLoadFunc);
|
||||
|
||||
void buildTypeIdentifierMap(
|
||||
|
@ -1668,9 +1666,7 @@ bool DevirtModule::areRemarksEnabled() {
|
|||
return false;
|
||||
}
|
||||
|
||||
void DevirtModule::scanTypeTestUsers(
|
||||
Function *TypeTestFunc,
|
||||
DenseMap<Metadata *, std::set<TypeMemberInfo>> &TypeIdMap) {
|
||||
void DevirtModule::scanTypeTestUsers(Function *TypeTestFunc) {
|
||||
// Find all virtual calls via a virtual table pointer %p under an assumption
|
||||
// of the form llvm.assume(llvm.type.test(%p, %md)). This indicates that %p
|
||||
// points to a member of the type identifier %md. Group calls by (type ID,
|
||||
|
@ -1690,10 +1686,10 @@ void DevirtModule::scanTypeTestUsers(
|
|||
auto &DT = LookupDomTree(*CI->getFunction());
|
||||
findDevirtualizableCallsForTypeTest(DevirtCalls, Assumes, CI, DT);
|
||||
|
||||
Metadata *TypeId =
|
||||
cast<MetadataAsValue>(CI->getArgOperand(1))->getMetadata();
|
||||
// If we found any, add them to CallSlots.
|
||||
if (!Assumes.empty()) {
|
||||
Metadata *TypeId =
|
||||
cast<MetadataAsValue>(CI->getArgOperand(1))->getMetadata();
|
||||
Value *Ptr = CI->getArgOperand(0)->stripPointerCasts();
|
||||
for (DevirtCallSite Call : DevirtCalls) {
|
||||
// Only add this CallSite if we haven't seen it before. The vtable
|
||||
|
@ -1706,13 +1702,6 @@ void DevirtModule::scanTypeTestUsers(
|
|||
}
|
||||
}
|
||||
|
||||
// If we have any uses on type metadata, keep the type test assumes for
|
||||
// later analysis. Otherwise remove as they aren't useful, and
|
||||
// LowerTypeTests will think they are Unsat and lower to False, which
|
||||
// breaks any uses on assumes.
|
||||
if (TypeIdMap.count(TypeId))
|
||||
continue;
|
||||
|
||||
// We no longer need the assumes or the type test.
|
||||
for (auto Assume : Assumes)
|
||||
Assume->eraseFromParent();
|
||||
|
@ -1911,13 +1900,8 @@ bool DevirtModule::run() {
|
|||
(!TypeCheckedLoadFunc || TypeCheckedLoadFunc->use_empty()))
|
||||
return false;
|
||||
|
||||
// Rebuild type metadata into a map for easy lookup.
|
||||
std::vector<VTableBits> Bits;
|
||||
DenseMap<Metadata *, std::set<TypeMemberInfo>> TypeIdMap;
|
||||
buildTypeIdentifierMap(Bits, TypeIdMap);
|
||||
|
||||
if (TypeTestFunc && AssumeFunc)
|
||||
scanTypeTestUsers(TypeTestFunc, TypeIdMap);
|
||||
scanTypeTestUsers(TypeTestFunc);
|
||||
|
||||
if (TypeCheckedLoadFunc)
|
||||
scanTypeCheckedLoadUsers(TypeCheckedLoadFunc);
|
||||
|
@ -1939,6 +1923,10 @@ bool DevirtModule::run() {
|
|||
return true;
|
||||
}
|
||||
|
||||
// Rebuild type metadata into a map for easy lookup.
|
||||
std::vector<VTableBits> Bits;
|
||||
DenseMap<Metadata *, std::set<TypeMemberInfo>> TypeIdMap;
|
||||
buildTypeIdentifierMap(Bits, TypeIdMap);
|
||||
if (TypeIdMap.empty())
|
||||
return true;
|
||||
|
||||
|
@ -1995,17 +1983,14 @@ bool DevirtModule::run() {
|
|||
// function implementation at offset S.first.ByteOffset, and add to
|
||||
// TargetsForSlot.
|
||||
std::vector<VirtualCallTarget> TargetsForSlot;
|
||||
WholeProgramDevirtResolution *Res = nullptr;
|
||||
if (ExportSummary && isa<MDString>(S.first.TypeID))
|
||||
// Create the type id summary resolution regardlness of whether we can
|
||||
// devirtualize, so that lower type tests knows the type id is used on
|
||||
// a global and not Unsat.
|
||||
Res = &ExportSummary
|
||||
->getOrInsertTypeIdSummary(
|
||||
cast<MDString>(S.first.TypeID)->getString())
|
||||
.WPDRes[S.first.ByteOffset];
|
||||
if (tryFindVirtualCallTargets(TargetsForSlot, TypeIdMap[S.first.TypeID],
|
||||
S.first.ByteOffset)) {
|
||||
WholeProgramDevirtResolution *Res = nullptr;
|
||||
if (ExportSummary && isa<MDString>(S.first.TypeID))
|
||||
Res = &ExportSummary
|
||||
->getOrInsertTypeIdSummary(
|
||||
cast<MDString>(S.first.TypeID)->getString())
|
||||
.WPDRes[S.first.ByteOffset];
|
||||
|
||||
if (!trySingleImplDevirt(ExportSummary, TargetsForSlot, S.second, Res)) {
|
||||
DidVirtualConstProp |=
|
||||
|
@ -2119,14 +2104,11 @@ void DevirtIndex::run() {
|
|||
std::vector<ValueInfo> TargetsForSlot;
|
||||
auto TidSummary = ExportSummary.getTypeIdCompatibleVtableSummary(S.first.TypeID);
|
||||
assert(TidSummary);
|
||||
// Create the type id summary resolution regardlness of whether we can
|
||||
// devirtualize, so that lower type tests knows the type id is used on
|
||||
// a global and not Unsat.
|
||||
WholeProgramDevirtResolution *Res =
|
||||
&ExportSummary.getOrInsertTypeIdSummary(S.first.TypeID)
|
||||
.WPDRes[S.first.ByteOffset];
|
||||
if (tryFindVirtualCallTargets(TargetsForSlot, *TidSummary,
|
||||
S.first.ByteOffset)) {
|
||||
WholeProgramDevirtResolution *Res =
|
||||
&ExportSummary.getOrInsertTypeIdSummary(S.first.TypeID)
|
||||
.WPDRes[S.first.ByteOffset];
|
||||
|
||||
if (!trySingleImplDevirt(TargetsForSlot, S.first, S.second, Res,
|
||||
DevirtTargets))
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
; RUN: opt -module-summary %s -o - | llvm-bcanalyzer -dump | FileCheck %s
|
||||
|
||||
; CHECK: <GLOBALVAL_SUMMARY_BLOCK
|
||||
; CHECK: <VERSION op0=9/>
|
||||
; CHECK: <VERSION op0=8/>
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -92,7 +92,6 @@
|
|||
; CHECK-O2-NEXT: Running analysis: DemandedBitsAnalysis
|
||||
; CHECK-O2-NEXT: Running pass: CrossDSOCFIPass
|
||||
; CHECK-O2-NEXT: Running pass: LowerTypeTestsPass
|
||||
; CHECK-O-NEXT: Running pass: LowerTypeTestsPass
|
||||
; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}SimplifyCFGPass>
|
||||
; CHECK-O2-NEXT: Running pass: EliminateAvailableExternallyPass
|
||||
; CHECK-O2-NEXT: Running pass: GlobalDCEPass
|
||||
|
|
|
@ -79,7 +79,6 @@
|
|||
; CHECK-O-NEXT: Running pass: LowerExpectIntrinsicPass
|
||||
; CHECK-O3-NEXT: Running pass: CallSiteSplittingPass
|
||||
; CHECK-O-NEXT: Finished llvm::Function pass manager run.
|
||||
; CHECK-POSTLINK-O-NEXT: Running pass: LowerTypeTestsPass
|
||||
; CHECK-O-NEXT: Running pass: IPSCCPPass
|
||||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
; CHECK-O-NEXT: Running pass: LowerExpectIntrinsicPass
|
||||
; CHECK-O3-NEXT: Running pass: CallSiteSplittingPass
|
||||
; CHECK-O-NEXT: Finished {{.*}}Function pass manager run.
|
||||
; CHECK-O-NEXT: Running pass: LowerTypeTestsPass
|
||||
; CHECK-O-NEXT: Running pass: IPSCCPPass
|
||||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
|
|
|
@ -59,7 +59,6 @@
|
|||
; CHECK-O-NEXT: Running analysis: CallGraphAnalysis
|
||||
; CHECK-O-NEXT: Running pass: RequireAnalysisPass<{{.*}}ProfileSummaryAnalysis
|
||||
; CHECK-O-NEXT: Running pass: PGOIndirectCallPromotion
|
||||
; CHECK-O-NEXT: Running pass: LowerTypeTestsPass
|
||||
; CHECK-O-NEXT: Running pass: IPSCCPPass
|
||||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
; SUMMARY: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid3:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
@ -23,7 +23,7 @@
|
|||
; SUMMARY-NEXT: ResByArg:
|
||||
; SUMMARY-NEXT: typeid1:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
@ -36,7 +36,7 @@
|
|||
; SUMMARY-NEXT: ResByArg:
|
||||
; SUMMARY-NEXT: typeid2:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
; RUN: -wholeprogramdevirt-summary-action=export -o /dev/null 2>&1 | FileCheck %s --check-prefix=MISSING-MODULE
|
||||
|
||||
; Check single impl devirtulation in summary
|
||||
; CHECK: typeid: (name: "_ZTS1A", summary: (typeTestRes: (kind: unknown, sizeM1BitWidth: 0), wpdResolutions: ((offset: 0, wpdRes: (kind: singleImpl, singleImplName: "_ZNK1A1fEv"))))) ; guid
|
||||
; CHECK: typeid: (name: "_ZTS1A", summary: (typeTestRes: (kind: unsat, sizeM1BitWidth: 0), wpdResolutions: ((offset: 0, wpdRes: (kind: singleImpl, singleImplName: "_ZNK1A1fEv"))))) ; guid
|
||||
|
||||
; MISSING-MODULE: combined summary should contain Regular LTO module
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
; SUMMARY: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid3:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
@ -17,7 +17,7 @@
|
|||
; SUMMARY-NEXT: ResByArg:
|
||||
; SUMMARY-NEXT: typeid1:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
@ -30,7 +30,7 @@
|
|||
; SUMMARY-NEXT: ResByArg:
|
||||
; SUMMARY-NEXT: typeid2:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
@ -43,7 +43,7 @@
|
|||
; SUMMARY-NEXT: ResByArg:
|
||||
; SUMMARY-NEXT: typeid4:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
; SUMMARY: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid4:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
; SUMMARY: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid3:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
@ -24,7 +24,7 @@
|
|||
; SUMMARY-NEXT: Bit: 0
|
||||
; SUMMARY-NEXT: typeid4:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
|
|
@ -9,7 +9,7 @@ target datalayout = "e-p:64:64"
|
|||
; SUMMARY: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid3:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
@ -29,7 +29,7 @@ target datalayout = "e-p:64:64"
|
|||
; SUMMARY-ARM-NEXT: Bit: 1
|
||||
; SUMMARY-NEXT: typeid4:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
; SUMMARY-NEXT: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid1:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
; SUMMARY-NEXT: Kind: Unknown
|
||||
; SUMMARY-NEXT: Kind: Unsat
|
||||
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
||||
; SUMMARY-NEXT: AlignLog2: 0
|
||||
; SUMMARY-NEXT: SizeM1: 0
|
||||
|
|
|
@ -25,7 +25,7 @@ define i32 @call(i8* %obj) {
|
|||
%fptr = load i8*, i8** %fptrptr
|
||||
%fptr_casted = bitcast i8* %fptr to i32 (i8*)*
|
||||
%result = call i32 %fptr_casted(i8* %obj)
|
||||
; CHECK-NOT: call i32 %
|
||||
; CHECK-NOT: call
|
||||
; CHECK: ret i32 123
|
||||
ret i32 %result
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue