From 64258773ad99b3b6a3eb2a456b79518c1444d9f3 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Fri, 26 Jun 2020 22:40:30 +0300 Subject: [PATCH] [CostModel] Avoid traditional ConstantExpr crashy pitfails I'm not sure if this is a regression from D81448 + D81643, which moved at least the code cast from elsewhere, or somehow no one triggered that before. But now we can reach it with a non-instruction.. It is not straight-forward to write cost-model tests for constantexprs, `-cost-model -analyze -cost-kind=` does not appear to look at them, or maybe i'm doing it wrong. I've encountered that via a SimplifyCFG crash, so reduced (currently-crashing) test is added. There are likely other instances. For now, simply restore previous status quo of not crashing and returning TTI::TCC_Basic. --- .../llvm/Analysis/TargetTransformInfoImpl.h | 13 ++++++--- llvm/test/Transforms/SimplifyCFG/constantexprs.ll | 31 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/SimplifyCFG/constantexprs.ll diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h index 9cae4f5..ca7106a 100644 --- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h +++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h @@ -918,13 +918,17 @@ public: CostKind, I); } case Instruction::InsertElement: { - auto *IE = cast(U); + auto *IE = dyn_cast(U); + if (!IE) + return TTI::TCC_Basic; // FIXME auto *CI = dyn_cast(IE->getOperand(2)); unsigned Idx = CI ? CI->getZExtValue() : -1; return TargetTTI->getVectorInstrCost(Opcode, Ty, Idx); } case Instruction::ShuffleVector: { - auto *Shuffle = cast(U); + auto *Shuffle = dyn_cast(U); + if (!Shuffle) + return TTI::TCC_Basic; // FIXME auto *VecTy = cast(U->getType()); auto *VecSrcTy = cast(U->getOperand(0)->getType()); @@ -954,7 +958,10 @@ public: } case Instruction::ExtractElement: { unsigned Idx = -1; - auto *EEI = cast(U); + auto *EEI = dyn_cast(U); + if (!EEI) + return TTI::TCC_Basic; // FIXME + auto *CI = dyn_cast(EEI->getOperand(1)); if (CI) Idx = CI->getZExtValue(); diff --git a/llvm/test/Transforms/SimplifyCFG/constantexprs.ll b/llvm/test/Transforms/SimplifyCFG/constantexprs.ll new file mode 100644 index 0000000..5cfe2cf --- /dev/null +++ b/llvm/test/Transforms/SimplifyCFG/constantexprs.ll @@ -0,0 +1,31 @@ +; RUN: opt -simplifycfg -S < %s | FileCheck %s + +; See that we do not crash when queriying cost model about the cost of constant expression extractelement. + +%"struct.(anonymous namespace)::aj" = type { %struct.o } +%struct.o = type { %struct.j } +%struct.j = type { %struct.c } +%struct.c = type { %struct.a } +%struct.a = type { i8 } +%struct.e = type { %struct.a* } + +$_ZN1eC2EPK1a = comdat any + +@_ZN12_GLOBAL__N_12anE = internal global %"struct.(anonymous namespace)::aj" zeroinitializer, align 1 + +declare dso_local i32 @_Zeq1eS_(%struct.a*, %struct.a*) local_unnamed_addr #2 + +define internal fastcc %struct.a* @_ZNK1jIiN12_GLOBAL__N_12ajEE2aeERKi() unnamed_addr #0 align 2 { +; CHECK-LABEL: @_ZNK1jIiN12_GLOBAL__N_12ajEE2aeERKi +entry: + %call = call i32 @_Zeq1eS_(%struct.a* null, %struct.a* null) + %tobool = icmp eq i32 %call, 0 + br i1 %tobool, label %cond.false, label %cond.end + +cond.false: ; preds = %entry + br label %cond.end + +cond.end: ; preds = %entry, %cond.false + %retval.sroa.0.0 = phi %struct.a* [ null, %cond.false ], [ extractelement (<1 x %struct.a*> inttoptr (<1 x i64> bitcast (i64 ptrtoint (%"struct.(anonymous namespace)::aj"* @_ZN12_GLOBAL__N_12anE to i64) to <1 x i64>) to <1 x %struct.a*>), i64 0), %entry ] + ret %struct.a* %retval.sroa.0.0 +} -- 2.7.4