mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Fix reassociate to clear optional flags, such as nsw.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124712 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1e1901a294
commit
46985a1440
@ -252,6 +252,12 @@ public:
|
|||||||
return SubclassOptionalData;
|
return SubclassOptionalData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// clearSubclassOptionalData - Clear the optional flags contained in
|
||||||
|
/// this value.
|
||||||
|
void clearSubclassOptionalData() {
|
||||||
|
SubclassOptionalData = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/// hasSameSubclassOptionalData - Test whether the optional flags contained
|
/// hasSameSubclassOptionalData - Test whether the optional flags contained
|
||||||
/// in this value are equal to the optional flags in the given value.
|
/// in this value are equal to the optional flags in the given value.
|
||||||
bool hasSameSubclassOptionalData(const Value *V) const {
|
bool hasSameSubclassOptionalData(const Value *V) const {
|
||||||
|
@ -240,6 +240,12 @@ void Reassociate::LinearizeExpr(BinaryOperator *I) {
|
|||||||
RHS->setOperand(0, LHS);
|
RHS->setOperand(0, LHS);
|
||||||
I->setOperand(0, RHS);
|
I->setOperand(0, RHS);
|
||||||
|
|
||||||
|
// Conservatively clear all the optional flags, which may not hold
|
||||||
|
// after the reassociation.
|
||||||
|
I->clearSubclassOptionalData();
|
||||||
|
LHS->clearSubclassOptionalData();
|
||||||
|
RHS->clearSubclassOptionalData();
|
||||||
|
|
||||||
++NumLinear;
|
++NumLinear;
|
||||||
MadeChange = true;
|
MadeChange = true;
|
||||||
DEBUG(dbgs() << "Linearized: " << *I << '\n');
|
DEBUG(dbgs() << "Linearized: " << *I << '\n');
|
||||||
@ -341,6 +347,11 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
|
|||||||
DEBUG(dbgs() << "RA: " << *I << '\n');
|
DEBUG(dbgs() << "RA: " << *I << '\n');
|
||||||
I->setOperand(0, Ops[i].Op);
|
I->setOperand(0, Ops[i].Op);
|
||||||
I->setOperand(1, Ops[i+1].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');
|
DEBUG(dbgs() << "TO: " << *I << '\n');
|
||||||
MadeChange = true;
|
MadeChange = true;
|
||||||
++NumChanged;
|
++NumChanged;
|
||||||
@ -356,6 +367,11 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
|
|||||||
if (I->getOperand(1) != Ops[i].Op) {
|
if (I->getOperand(1) != Ops[i].Op) {
|
||||||
DEBUG(dbgs() << "RA: " << *I << '\n');
|
DEBUG(dbgs() << "RA: " << *I << '\n');
|
||||||
I->setOperand(1, Ops[i].Op);
|
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');
|
DEBUG(dbgs() << "TO: " << *I << '\n');
|
||||||
MadeChange = true;
|
MadeChange = true;
|
||||||
++NumChanged;
|
++NumChanged;
|
||||||
|
22
test/Transforms/Reassociate/optional-flags.ll
Normal file
22
test/Transforms/Reassociate/optional-flags.ll
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user