Skip to content

Commit b48819d

Browse files
committed
Revert " [LICM] Fold associative binary ops to promote code hoisting (llvm#81608)"
This reverts commit f2ccf80. The flag propagation code is incorrect.
1 parent f18dd9e commit b48819d

File tree

6 files changed

+163
-335
lines changed

6 files changed

+163
-335
lines changed

llvm/lib/Transforms/Scalar/LICM.cpp

-62
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,6 @@ STATISTIC(NumFPAssociationsHoisted, "Number of invariant FP expressions "
113113
STATISTIC(NumIntAssociationsHoisted,
114114
"Number of invariant int expressions "
115115
"reassociated and hoisted out of the loop");
116-
STATISTIC(NumBOAssociationsHoisted, "Number of invariant BinaryOp expressions "
117-
"reassociated and hoisted out of the loop");
118116

119117
/// Memory promotion is enabled by default.
120118
static cl::opt<bool>
@@ -2781,60 +2779,6 @@ static bool hoistMulAddAssociation(Instruction &I, Loop &L,
27812779
return true;
27822780
}
27832781

2784-
/// Reassociate general associative binary expressions of the form
2785-
///
2786-
/// 1. "(LV op C1) op C2" ==> "LV op (C1 op C2)"
2787-
///
2788-
/// where op is an associative binary op, LV is a loop variant, and C1 and C2
2789-
/// are loop invariants that we want to hoist.
2790-
///
2791-
/// TODO: This can be extended to more cases such as
2792-
/// 2. "C1 op (C2 op LV)" ==> "(C1 op C2) op LV"
2793-
/// 3. "(C1 op LV) op C2" ==> "LV op (C1 op C2)" if op is commutative
2794-
/// 4. "C1 op (LV op C2)" ==> "(C1 op C2) op LV" if op is commutative
2795-
static bool hoistBOAssociation(Instruction &I, Loop &L,
2796-
ICFLoopSafetyInfo &SafetyInfo,
2797-
MemorySSAUpdater &MSSAU, AssumptionCache *AC,
2798-
DominatorTree *DT) {
2799-
BinaryOperator *BO = dyn_cast<BinaryOperator>(&I);
2800-
if (!BO || !BO->isAssociative())
2801-
return false;
2802-
2803-
Instruction::BinaryOps Opcode = BO->getOpcode();
2804-
BinaryOperator *Op0 = dyn_cast<BinaryOperator>(BO->getOperand(0));
2805-
2806-
// Transform: "(LV op C1) op C2" ==> "LV op (C1 op C2)"
2807-
if (Op0 && Op0->getOpcode() == Opcode) {
2808-
Value *LV = Op0->getOperand(0);
2809-
Value *C1 = Op0->getOperand(1);
2810-
Value *C2 = BO->getOperand(1);
2811-
2812-
if (L.isLoopInvariant(LV) || !L.isLoopInvariant(C1) ||
2813-
!L.isLoopInvariant(C2))
2814-
return false;
2815-
2816-
auto *Preheader = L.getLoopPreheader();
2817-
assert(Preheader && "Loop is not in simplify form?");
2818-
IRBuilder<> Builder(Preheader->getTerminator());
2819-
Value *Inv = Builder.CreateBinOp(Opcode, C1, C2, "invariant.op");
2820-
2821-
auto *NewBO =
2822-
BinaryOperator::Create(Opcode, LV, Inv, BO->getName() + ".reass", BO);
2823-
NewBO->copyIRFlags(BO);
2824-
BO->replaceAllUsesWith(NewBO);
2825-
eraseInstruction(*BO, SafetyInfo, MSSAU);
2826-
2827-
// Note: (LV op C1) might not be erased if it has more uses than the one we
2828-
// just replaced.
2829-
if (Op0->use_empty())
2830-
eraseInstruction(*Op0, SafetyInfo, MSSAU);
2831-
2832-
return true;
2833-
}
2834-
2835-
return false;
2836-
}
2837-
28382782
static bool hoistArithmetics(Instruction &I, Loop &L,
28392783
ICFLoopSafetyInfo &SafetyInfo,
28402784
MemorySSAUpdater &MSSAU, AssumptionCache *AC,
@@ -2872,12 +2816,6 @@ static bool hoistArithmetics(Instruction &I, Loop &L,
28722816
return true;
28732817
}
28742818

2875-
if (hoistBOAssociation(I, L, SafetyInfo, MSSAU, AC, DT)) {
2876-
++NumHoisted;
2877-
++NumBOAssociationsHoisted;
2878-
return true;
2879-
}
2880-
28812819
return false;
28822820
}
28832821

0 commit comments

Comments
 (0)