================ @@ -3143,6 +3143,45 @@ def CIR_AssumeOp : CIR_Op<"assume"> { }]; } +def CIR_AssumeAlignedOp : CIR_Op<"assume_aligned", [ + Pure, AllTypesMatch<["pointer", "result"]> +]> { + let summary = "Tell the optimizer that a pointer is aligned"; + let description = [{ + The `cir.assume_aligned` operation takes two or three arguments. The first + argument `pointer` gives the pointer value whose alignment is to be assumed, + and the second argument `align` is an integer attribute that gives the + assumed alignment. + + The `offset` argument is optional. If given, it represents misalignment + offset. When it's present, this operation tells the optimizer that the + pointer is always misaligned to the alignment by `offset` bytes, a.k.a. the + pointer yielded by `(char *)pointer - offset` is aligned to the specified + alignment. Note that the `offset` argument is an SSA value rather than an + attribute, which means that you could pass a dynamically determined value + as the mialignment offset. + + The result of this operation has the same value as the `pointer` argument, + but it additionally carries any alignment information indicated by this + operation. + + This operation corresponds to the `__builtin_assume_aligned` builtin + function. ---------------- bcardosolopes wrote:
Can you please add a small example? https://github.com/llvm/llvm-project/pull/152152 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits