mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-30 17:33:24 +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;
|
||||
}
|
||||
|
||||
/// 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;
|
||||
|
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