mirror of
https://github.com/intel/llvm.git
synced 2026-01-13 11:02:04 +08:00
[DA] Remove special handling for SCEVAddExpr in GCD MIV (#169927)
In `gcdMIVtest`, there is logic that assumes the addition(s) of `SCEVAddExpr` don't overflow without any checks. Adding overflow checks would be fine, but this part appeart to be less useful. So this patch removes it. Fix one of the tests added in #169926.
This commit is contained in:
@@ -2587,30 +2587,12 @@ bool DependenceInfo::gcdMIVtest(const SCEV *Src, const SCEV *Dst,
|
||||
return false;
|
||||
LLVM_DEBUG(dbgs() << " Delta = " << *Delta << "\n");
|
||||
const SCEVConstant *Constant = dyn_cast<SCEVConstant>(Delta);
|
||||
if (const SCEVAddExpr *Sum = dyn_cast<SCEVAddExpr>(Delta)) {
|
||||
// If Delta is a sum of products, we may be able to make further progress.
|
||||
for (const SCEV *Operand : Sum->operands()) {
|
||||
if (isa<SCEVConstant>(Operand)) {
|
||||
assert(!Constant && "Surprised to find multiple constants");
|
||||
Constant = cast<SCEVConstant>(Operand);
|
||||
} else if (const SCEVMulExpr *Product = dyn_cast<SCEVMulExpr>(Operand)) {
|
||||
// Search for constant operand to participate in GCD;
|
||||
// If none found; return false.
|
||||
std::optional<APInt> ConstOp = getConstanCoefficient(Product);
|
||||
if (!ConstOp)
|
||||
return false;
|
||||
ExtraGCD = APIntOps::GreatestCommonDivisor(ExtraGCD, ConstOp->abs());
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!Constant)
|
||||
return false;
|
||||
APInt ConstDelta = cast<SCEVConstant>(Constant)->getAPInt();
|
||||
LLVM_DEBUG(dbgs() << " ConstDelta = " << ConstDelta << "\n");
|
||||
if (ConstDelta == 0)
|
||||
return false;
|
||||
RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ExtraGCD);
|
||||
LLVM_DEBUG(dbgs() << " RunningGCD = " << RunningGCD << "\n");
|
||||
APInt Remainder = ConstDelta.srem(RunningGCD);
|
||||
if (Remainder != 0) {
|
||||
|
||||
@@ -127,9 +127,8 @@ exit:
|
||||
; A[-3*i - 3*m - INT64_MAX] = 1;
|
||||
; }
|
||||
;
|
||||
; FIXME: DependenceAnalysis currently detects no dependency between the two
|
||||
; stores, but it may exist. For example, consider `m = 1`. Then,
|
||||
; `-3*m - INT64_MAX` is `INT64_MAX - 1`. So `-3*i - 3*m - INT64_MAX` is
|
||||
; Dependency may exist between the two stores. For example, consider `m = 1`.
|
||||
; Then, `-3*m - INT64_MAX` is `INT64_MAX - 1`. So `-3*i - 3*m - INT64_MAX` is
|
||||
; effectively `-3*i + (INT64_MAX - 1)`. Thus, accesses will be as follows:
|
||||
;
|
||||
; memory access | i == 1 | i == max_i - 1
|
||||
@@ -143,7 +142,7 @@ define void @gcdmiv_const_ovfl(ptr %A, i64 %m) {
|
||||
; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
; CHECK-ALL-NEXT: da analyze - output [*|<]!
|
||||
; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
;
|
||||
@@ -151,7 +150,7 @@ define void @gcdmiv_const_ovfl(ptr %A, i64 %m) {
|
||||
; CHECK-GCD-MIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
|
||||
; CHECK-GCD-MIV-NEXT: da analyze - consistent output [*]!
|
||||
; CHECK-GCD-MIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
|
||||
; CHECK-GCD-MIV-NEXT: da analyze - none!
|
||||
; CHECK-GCD-MIV-NEXT: da analyze - consistent output [*|<]!
|
||||
; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
|
||||
; CHECK-GCD-MIV-NEXT: da analyze - consistent output [*]!
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user