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).
Этот коммит содержится в:
родитель
33f76d1c2e
коммит
2fd8f103ab
1 изменённых файлов: 9 добавлений и 3 удалений
|
@ -118,12 +118,18 @@ func LowerFuncValues(mod llvm.Module) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, funcValueWithSignatureGlobal := range getUses(funcValueWithSignatureConstant) {
|
for _, funcValueWithSignatureGlobal := range getUses(funcValueWithSignatureConstant) {
|
||||||
|
id := llvm.ConstInt(uintptrType, uint64(fn.id), false)
|
||||||
for _, use := range getUses(funcValueWithSignatureGlobal) {
|
for _, use := range getUses(funcValueWithSignatureGlobal) {
|
||||||
if ptrtoint.IsAConstantExpr().IsNil() || ptrtoint.Opcode() != llvm.PtrToInt {
|
// Try to replace uses directly: most will be
|
||||||
panic("expected const ptrtoint")
|
// 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()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче