blob: 37cecd7d74cd47214af5e311e13f9553261f4d3e [file] [log] [blame]
Peter Collingbournead9841e2014-11-27 00:06:42 +00001//===- utils.go - misc utils ----------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements misellaneous utilities for IR generation.
11//
12//===----------------------------------------------------------------------===//
13
14package irgen
15
16import (
Peter Collingbourne56109b72015-01-13 20:45:08 +000017 "llvm.org/llgo/third_party/gotools/go/types"
Peter Collingbournead9841e2014-11-27 00:06:42 +000018 "llvm.org/llvm/bindings/go/llvm"
19)
20
21func (fr *frame) loadOrNull(cond, ptr llvm.Value, ty types.Type) *govalue {
22 startbb := fr.builder.GetInsertBlock()
23 loadbb := llvm.AddBasicBlock(fr.function, "")
24 contbb := llvm.AddBasicBlock(fr.function, "")
25 fr.builder.CreateCondBr(cond, loadbb, contbb)
26
27 fr.builder.SetInsertPointAtEnd(loadbb)
28 llty := fr.types.ToLLVM(ty)
29 typedptr := fr.builder.CreateBitCast(ptr, llvm.PointerType(llty, 0), "")
30 loadedval := fr.builder.CreateLoad(typedptr, "")
31 fr.builder.CreateBr(contbb)
32
33 fr.builder.SetInsertPointAtEnd(contbb)
34 llv := fr.builder.CreatePHI(llty, "")
35 llv.AddIncoming(
36 []llvm.Value{llvm.ConstNull(llty), loadedval},
37 []llvm.BasicBlock{startbb, loadbb},
38 )
39 return newValue(llv, ty)
40}