For starters, LLVM has a very simple type system. <i>very simple</i>.  So pretty much any optimization that relies on type knowledge, unless it&#x27;s a simple optimization (IE can be expressed as an attribute on lowered types, ...) needs are a higher level IR.
Things are also legal in LLVM IR that are not legal in any of the languages it supports, for example, getelementptr can be used with negative indices, etc.<p>Some language rules and optimizations are easy to express in LLVM IR, but there are plenty that are not.<p>You could add metadata, but you&#x27;d probably have to extend how metadata works to support a bunch of things, and even then, the community would want metadata designs that multiple language frontends can use, not just yours.