Fix reassociate to clear optional flags, such as nsw.

llvm-svn: 124712
This commit is contained in:
Dan Gohman 2011-02-02 02:02:34 +00:00
parent 31f7d460fa
commit 08d2c98c23
3 changed files with 44 additions and 0 deletions

View File

@ -252,6 +252,12 @@ public:
return SubclassOptionalData;
}
/// clearSubclassOptionalData - Clear the optional flags contained in
/// this value.
void clearSubclassOptionalData() {
SubclassOptionalData = 0;
}
/// hasSameSubclassOptionalData - Test whether the optional flags contained
/// in this value are equal to the optional flags in the given value.
bool hasSameSubclassOptionalData(const Value *V) const {

View File

@ -240,6 +240,12 @@ void Reassociate::LinearizeExpr(BinaryOperator *I) {
RHS->setOperand(0, LHS);
I->setOperand(0, RHS);
// Conservatively clear all the optional flags, which may not hold
// after the reassociation.
I->clearSubclassOptionalData();
LHS->clearSubclassOptionalData();
RHS->clearSubclassOptionalData();
++NumLinear;
MadeChange = true;
DEBUG(dbgs() << "Linearized: " << *I << '\n');
@ -341,6 +347,11 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
DEBUG(dbgs() << "RA: " << *I << '\n');
I->setOperand(0, Ops[i].Op);
I->setOperand(1, Ops[i+1].Op);
// Conservatively clear all the optional flags, which may not hold
// after the reassociation.
I->clearSubclassOptionalData();
DEBUG(dbgs() << "TO: " << *I << '\n');
MadeChange = true;
++NumChanged;
@ -356,6 +367,11 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
if (I->getOperand(1) != Ops[i].Op) {
DEBUG(dbgs() << "RA: " << *I << '\n');
I->setOperand(1, Ops[i].Op);
// Conservatively clear all the optional flags, which may not hold
// after the reassociation.
I->clearSubclassOptionalData();
DEBUG(dbgs() << "TO: " << *I << '\n');
MadeChange = true;
++NumChanged;

View File

@ -0,0 +1,22 @@
; RUN: opt -S -reassociate < %s | FileCheck %s
; rdar://8944681
; Reassociate should clear optional flags like nsw when reassociating.
; CHECK: @test0
; CHECK: %y = add i64 %b, %a
; CHECK: %z = add i64 %y, %c
define i64 @test0(i64 %a, i64 %b, i64 %c) {
%y = add nsw i64 %c, %b
%z = add i64 %y, %a
ret i64 %z
}
; CHECK: @test1
; CHECK: %y = add i64 %b, %a
; CHECK: %z = add i64 %y, %c
define i64 @test1(i64 %a, i64 %b, i64 %c) {
%y = add i64 %c, %b
%z = add nsw i64 %y, %a
ret i64 %z
}