From 2fd8f103ab61b8306025b91a8892c7608330b9e0 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 9 Apr 2021 14:46:19 +0200 Subject: [PATCH] transform: fix func lowering assertion failure The func-lowering pass has started to fail in the dev branch, probably as a result of replacing the ConstPropagation pass with the IPSCCP pass. This commit makes the code a bit more robust and should be able to handle all possible cases (not just ptrtoint). --- transform/func-lowering.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/transform/func-lowering.go b/transform/func-lowering.go index 89c9f692..02341a83 100644 --- a/transform/func-lowering.go +++ b/transform/func-lowering.go @@ -118,12 +118,18 @@ func LowerFuncValues(mod llvm.Module) { continue } for _, funcValueWithSignatureGlobal := range getUses(funcValueWithSignatureConstant) { + id := llvm.ConstInt(uintptrType, uint64(fn.id), false) for _, use := range getUses(funcValueWithSignatureGlobal) { - if ptrtoint.IsAConstantExpr().IsNil() || ptrtoint.Opcode() != llvm.PtrToInt { - panic("expected const ptrtoint") + // Try to replace uses directly: most will be + // ptrtoint instructions. + if !use.IsAConstantExpr().IsNil() && use.Opcode() == llvm.PtrToInt { + use.ReplaceAllUsesWith(id) } - use.ReplaceAllUsesWith(llvm.ConstInt(uintptrType, uint64(fn.id), false)) } + // Remaining uses can be replaced using a ptrtoint. + // In my quick testing, this doesn't really happen in + // practice. + funcValueWithSignatureGlobal.ReplaceAllUsesWith(llvm.ConstIntToPtr(id, funcValueWithSignatureGlobal.Type())) } } }