@@ -76,9 +76,13 @@ When to merge instruction locations
76
76
-----------------------------------
77
77
78
78
A transformation should merge instruction locations if it replaces multiple
79
- instructions with a single merged instruction, *and * that merged instruction
80
- does not correspond to any of the original instructions' locations. The API to
81
- use is ``Instruction::applyMergedLocation ``.
79
+ instructions with one or more new instructions, *and * the new instruction(s)
80
+ produce the output of more than one of the original instructions. The API to
81
+ use is ``Instruction::applyMergedLocation ``, and the new location should be a
82
+ merge of the locations of all the instructions whose output is produced in the
83
+ new instructions; typically, this includes any instruction being RAUWed by a new
84
+ instruction, and excludes any instruction that only produces an intermediate
85
+ value used by the RAUWed instruction.
82
86
83
87
The purpose of this rule is to ensure that a) the single merged instruction
84
88
has a location with an accurate scope attached, and b) to prevent misleading
@@ -101,10 +105,10 @@ Examples of transformations that should follow this rule include:
101
105
* Merging identical loop-invariant stores (see the LICM utility
102
106
``llvm::promoteLoopAccessesToScalars ``).
103
107
104
- * Peephole optimizations which combine multiple instructions together , like
105
- ``(add (mul A B) C) => llvm.fma.f32(A, B, C) ``. Note that the location of
106
- the `` fma `` does not exactly correspond to the locations of either the
107
- `` mul `` or the `` add `` instructions .
108
+ * Scalar instructions being combined into a vector instruction , like
109
+ ``(add A1, B1), (add A2, B2) => (add (A1, A2), (B1, B2)) ``. As the new vector
110
+ `` add `` computes the result of both original `` add `` instructions
111
+ simultaneously, it should use a merge of the two locations .
108
112
109
113
Examples of transformations for which this rule *does not * apply include:
110
114
@@ -113,6 +117,11 @@ Examples of transformations for which this rule *does not* apply include:
113
117
``zext `` is modified but remains in its block, so the rule for
114
118
:ref: `preserving locations<WhenToPreserveLocation> ` should apply.
115
119
120
+ * Peephole optimizations which combine multiple instructions together, like
121
+ ``(add (mul A B) C) => llvm.fma.f32(A, B, C) ``. Note that the result of the
122
+ ``mul `` no longer appears in the program, while the result of the ``add `` is
123
+ now produced by the ``fma ``, so the ``add ``'s location should be used.
124
+
116
125
* Converting an if-then-else CFG diamond into a ``select ``. Preserving the
117
126
debug locations of speculated instructions can make it seem like a condition
118
127
is true when it's not (or vice versa), which leads to a confusing
0 commit comments