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).
Этот коммит содержится в:
Ayke van Laethem 2021-04-09 14:46:19 +02:00 коммит произвёл Ron Evans
родитель 33f76d1c2e
коммит 2fd8f103ab

Просмотреть файл

@ -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()))
}
}
}