diff --git a/llvm/core.py b/llvm/core.py index f6007c3..40b1c9c 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -1866,13 +1866,17 @@ class Builder(object): check_is_value(ptr) return _make_value(_core.LLVMBuildFree(self.ptr, ptr.ptr)) - def load(self, ptr, name="", align=0, volatile=False): + def load(self, ptr, name="", align=0, volatile=False, invariant=False): check_is_value(ptr) inst = _make_value(_core.LLVMBuildLoad(self.ptr, ptr.ptr, name)) if align: _core.LLVMLdSetAlignment(inst.ptr, align) if volatile: inst.set_volatile(volatile) + if invariant: + mod = self.basic_block.function.module + md = MetaData.get(mod, []) # empty metadata node + inst.set_metadata('invariant.load', md) return inst def store(self, value, ptr, align=0, volatile=False): diff --git a/test/metadata.py b/test/metadata.py index 63118f5..ffa889a 100644 --- a/test/metadata.py +++ b/test/metadata.py @@ -23,6 +23,20 @@ class TestMetaData(unittest.TestCase): self.assertIn('!nontemporal', str(loadinst)) + def test_meta_load_invariant(self): + module = Module.new('test_meta_load_invariant') + func = module.add_function(Type.function(Type.void(), []), + name='test_load_invariant') + bldr = Builder.new(func.append_basic_block('entry')) + addr = Constant.int(Type.int(), 0xdeadbeef) + loadinst = bldr.load(bldr.inttoptr(addr, Type.pointer(Type.int(8))), + invariant=True) + + bldr.ret_void() + module.verify() + + self.assertIn('!invariant.load', str(loadinst)) + if __name__ == '__main__': unittest.main()