diff --git a/llvm/docs/HowToUpdateDebugInfo.rst b/llvm/docs/HowToUpdateDebugInfo.rst index f7db92d58f435..d8c300f2f3a70 100644 --- a/llvm/docs/HowToUpdateDebugInfo.rst +++ b/llvm/docs/HowToUpdateDebugInfo.rst @@ -76,9 +76,13 @@ When to merge instruction locations ----------------------------------- A transformation should merge instruction locations if it replaces multiple -instructions with a single merged instruction, *and* that merged instruction -does not correspond to any of the original instructions' locations. The API to -use is ``Instruction::applyMergedLocation``. +instructions with one or more new instructions, *and* the new instruction(s) +produce the output of more than one of the original instructions. The API to use +is ``Instruction::applyMergedLocation``. For each new instruction I, its new +location should be a merge of the locations of all instructions whose output is +produced by I. Typically, this includes any instruction being RAUWed by a new +instruction, and excludes any instruction that only produces an intermediate +value used by the RAUWed instruction. The purpose of this rule is to ensure that a) the single merged instruction has a location with an accurate scope attached, and b) to prevent misleading @@ -101,10 +105,15 @@ Examples of transformations that should follow this rule include: * Merging identical loop-invariant stores (see the LICM utility ``llvm::promoteLoopAccessesToScalars``). -* Peephole optimizations which combine multiple instructions together, like - ``(add (mul A B) C) => llvm.fma.f32(A, B, C)``. Note that the location of - the ``fma`` does not exactly correspond to the locations of either the - ``mul`` or the ``add`` instructions. +* Scalar instructions being combined into a vector instruction, like + ``(add A1, B1), (add A2, B2) => (add (A1, A2), (B1, B2))``. As the new vector + ``add`` computes the result of both original ``add`` instructions + simultaneously, it should use a merge of the two locations. Similarly, if + prior optimizations have already produced vectors ``(A1, A2)`` and + ``(B2, B1)``, then we might create a ``(shufflevector (1, 0), (B2, B1))`` + instruction to produce ``(B1, B2)`` for the vector ``add``; in this case we've + created two instructions to replace the original ``adds``, so both new + instructions should use the merged location. Examples of transformations for which this rule *does not* apply include: @@ -113,6 +122,11 @@ Examples of transformations for which this rule *does not* apply include: ``zext`` is modified but remains in its block, so the rule for :ref:`preserving locations` should apply. +* Peephole optimizations which combine multiple instructions together, like + ``(add (mul A B) C) => llvm.fma.f32(A, B, C)``. Note that the result of the + ``mul`` no longer appears in the program, while the result of the ``add`` is + now produced by the ``fma``, so the ``add``'s location should be used. + * Converting an if-then-else CFG diamond into a ``select``. Preserving the debug locations of speculated instructions can make it seem like a condition is true when it's not (or vice versa), which leads to a confusing