`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 https://github.com/llvm/llvm-project/issues/135182.
28 lines
828 B
LLVM
28 lines
828 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: opt -S -passes=indvars < %s | FileCheck %s
|
|
|
|
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"
|
|
|
|
define i32 @pr135182() {
|
|
; CHECK-LABEL: define i32 @pr135182() {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: br i1 false, label %[[FOR_BODY]], label %[[FOR_END:.*]]
|
|
; CHECK: [[FOR_END]]:
|
|
; CHECK-NEXT: ret i32 65512
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body:
|
|
%indvar = phi i16 [ -12, %entry ], [ %indvar.next, %for.body ]
|
|
%add = add i16 %indvar, %indvar
|
|
%ext = zext i16 %add to i32
|
|
%indvar.next = add i16 %indvar, 1
|
|
br i1 false, label %for.body, label %for.end
|
|
|
|
for.end:
|
|
ret i32 %ext
|
|
}
|