Skip to content

Commit d15fef4

Browse files
dtcxzywtstellar
authored andcommitted
[IndVarSimplify] Handle the case where both operands are the same when widening IV (#135207)
`WidenIV::widenWithVariantUse` assumes that exactly one of the binop operands is the IV to be widened. This miscompilation happens when it tries to sign-extend the "NonIV" operand while the IV is zero-extended. Closes #135182. (cherry picked from commit d14acb7)
1 parent 91647ae commit d15fef4

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

llvm/lib/Transforms/Utils/SimplifyIndVar.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -1742,6 +1742,9 @@ bool WidenIV::widenWithVariantUse(WidenIV::NarrowIVDefUse DU) {
17421742
// TODO: Support case for NarrowDef = NarrowUse->getOperand(1).
17431743
if (NarrowUse->getOperand(0) != NarrowDef)
17441744
return false;
1745+
// We cannot use a different extend kind for the same operand.
1746+
if (NarrowUse->getOperand(1) == NarrowDef)
1747+
return false;
17451748
if (!SE->isKnownNegative(RHS))
17461749
return false;
17471750
bool ProvedSubNUW = SE->isKnownPredicateAt(ICmpInst::ICMP_UGE, LHS,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes=indvars < %s | FileCheck %s
3+
4+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
5+
6+
define i32 @pr135182() {
7+
; CHECK-LABEL: define i32 @pr135182() {
8+
; CHECK-NEXT: [[ENTRY:.*:]]
9+
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
10+
; CHECK: [[FOR_BODY]]:
11+
; CHECK-NEXT: br i1 false, label %[[FOR_BODY]], label %[[FOR_END:.*]]
12+
; CHECK: [[FOR_END]]:
13+
; CHECK-NEXT: ret i32 65512
14+
;
15+
entry:
16+
br label %for.body
17+
18+
for.body:
19+
%indvar = phi i16 [ -12, %entry ], [ %indvar.next, %for.body ]
20+
%add = add i16 %indvar, %indvar
21+
%ext = zext i16 %add to i32
22+
%indvar.next = add i16 %indvar, 1
23+
br i1 false, label %for.body, label %for.end
24+
25+
for.end:
26+
ret i32 %ext
27+
}

0 commit comments

Comments
 (0)