mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
Fix PR9039, a use-after-free in reassociate. The issue was that the
operand being factorized (and erased) could occur several times in Ops, resulting in freed memory being used when the next occurrence in Ops was analyzed. llvm-svn: 124287
This commit is contained in:
parent
8c38fe01dd
commit
e1912ca7e0
@ -811,16 +811,23 @@ Value *Reassociate::OptimizeAdd(Instruction *I,
|
||||
// RemoveFactorFromExpression on successive values to behave differently.
|
||||
Instruction *DummyInst = BinaryOperator::CreateAdd(MaxOccVal, MaxOccVal);
|
||||
SmallVector<Value*, 4> NewMulOps;
|
||||
for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
|
||||
for (unsigned i = 0; i != Ops.size(); ++i) {
|
||||
// Only try to remove factors from expressions we're allowed to.
|
||||
BinaryOperator *BOp = dyn_cast<BinaryOperator>(Ops[i].Op);
|
||||
if (BOp == 0 || BOp->getOpcode() != Instruction::Mul || !BOp->use_empty())
|
||||
continue;
|
||||
|
||||
if (Value *V = RemoveFactorFromExpression(Ops[i].Op, MaxOccVal)) {
|
||||
NewMulOps.push_back(V);
|
||||
Ops.erase(Ops.begin()+i);
|
||||
--i; --e;
|
||||
// The factorized operand may occur several times. Convert them all in
|
||||
// one fell swoop.
|
||||
for (unsigned j = Ops.size(); j != i;) {
|
||||
--j;
|
||||
if (Ops[j].Op == Ops[i].Op) {
|
||||
NewMulOps.push_back(V);
|
||||
Ops.erase(Ops.begin()+j);
|
||||
}
|
||||
}
|
||||
--i;
|
||||
}
|
||||
}
|
||||
|
||||
|
35
test/Transforms/Reassociate/2011-01-26-UseAfterFree.ll
Normal file
35
test/Transforms/Reassociate/2011-01-26-UseAfterFree.ll
Normal file
@ -0,0 +1,35 @@
|
||||
; RUN: opt < %s -reassociate
|
||||
; PR9039
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
|
||||
target triple = "i386-gnu-linux"
|
||||
|
||||
%ada__tags__T15s = type void ()
|
||||
|
||||
define void @exp_averages_intraday__deviation() {
|
||||
entry:
|
||||
%0 = load i32* undef, align 4
|
||||
%1 = shl i32 %0, 2
|
||||
%2 = add nsw i32 undef, %1
|
||||
%3 = add nsw i32 %2, undef
|
||||
%4 = mul nsw i32 %0, 12
|
||||
%5 = add nsw i32 %3, %4
|
||||
%6 = add nsw i32 %5, %4
|
||||
%7 = add nsw i32 %6, undef
|
||||
br i1 false, label %"4", label %"12"
|
||||
|
||||
"4": ; preds = %entry
|
||||
br i1 undef, label %"5", label %"8"
|
||||
|
||||
"5": ; preds = %"4"
|
||||
unreachable
|
||||
|
||||
"8": ; preds = %"4"
|
||||
%8 = getelementptr inbounds i8* undef, i32 %6
|
||||
br i1 undef, label %"13", label %"12"
|
||||
|
||||
"12": ; preds = %"8", %entry
|
||||
ret void
|
||||
|
||||
"13": ; preds = %"8"
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user