Danila Malyutin ba1349fc31
[SCEV] Fix "quick and dirty" difference that could lead to assert (#70688)
The old algorithm would remove all operands matching %step SCEV when it
intended to only remove a single one. This lead to assert when
SCEVAddExpr was of the form %step + %step and potential miscompiles in
similar cases. Such SCEVs could be created when construction reached
depth thresholds.

Fixes #70348
2023-10-31 00:50:57 +03:00

24 lines
704 B
LLVM

; RUN: opt -S -passes=loop-reduce -scalar-evolution-max-arith-depth=0 %s | FileCheck %s
;
; Make sure we don't trigger an assertion in SCEV here.
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"
define void @test(i32 %phi) {
; CHECK-LABEL: test
bb:
br label %bb6
bb6: ; preds = %bb6, %bb
%phi7 = phi i32 [ 1, %bb ], [ %add44, %bb6 ]
%mul13 = mul i32 %phi7, %phi
%mul16 = mul i32 %mul13, 0
%add44 = add i32 %phi7, 1
br i1 true, label %bb51, label %bb6
bb51: ; preds = %bb6
unreachable
}