Fix reassociate to clear optional flags, such as nsw.
llvm-svn: 124712
This commit is contained in:
parent
31f7d460fa
commit
08d2c98c23
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue