We are replacing a narrow IV increment with a wider one. If the original (narrow) increment did not wrap, the wider one should not wrap either. Set the flags to be the union of both wide increment and original increment; this ensures we preserve flags SCEV could infer for the wider increment. Fixes https://github.com/llvm/llvm-project/issues/71517.
55 lines
2.1 KiB
LLVM
55 lines
2.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -passes=indvars -S < %s | FileCheck %s
|
|
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-pc-windows-msvc18.0.0"
|
|
|
|
define i32 @fn2() personality ptr @__CxxFrameHandler3 {
|
|
; CHECK-LABEL: @fn2(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_COND:%.*]]
|
|
; CHECK: for.cond:
|
|
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[ENTRY:%.*]] ]
|
|
; CHECK-NEXT: [[INDVARS1:%.*]] = trunc i64 [[INDVARS_IV]] to i32
|
|
; CHECK-NEXT: invoke void @fn1(i64 [[INDVARS_IV]])
|
|
; CHECK-NEXT: to label [[FOR_INC]] unwind label [[CATCH_DISPATCH:%.*]]
|
|
; CHECK: catch.dispatch:
|
|
; CHECK-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ [[INDVARS1]], [[FOR_COND]] ]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = catchswitch within none [label %catch] unwind to caller
|
|
; CHECK: catch:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = catchpad within [[TMP0]] [ptr null, i32 64, ptr null]
|
|
; CHECK-NEXT: catchret from [[TMP1]] to label [[EXIT:%.*]]
|
|
; CHECK: exit:
|
|
; CHECK-NEXT: ret i32 [[C_0_LCSSA]]
|
|
; CHECK: for.inc:
|
|
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
|
|
; CHECK-NEXT: br label [[FOR_COND]]
|
|
;
|
|
entry:
|
|
br label %for.cond
|
|
|
|
for.cond: ; preds = %for.inc, %entry
|
|
%c.0 = phi i32 [ %inc, %for.inc ], [ 0, %entry ]
|
|
%idxprom = sext i32 %c.0 to i64
|
|
invoke void @fn1(i64 %idxprom)
|
|
to label %for.inc unwind label %catch.dispatch
|
|
|
|
catch.dispatch: ; preds = %for.cond
|
|
%c.0.lcssa = phi i32 [ %c.0, %for.cond ]
|
|
%0 = catchswitch within none [label %catch] unwind to caller
|
|
|
|
catch: ; preds = %catch.dispatch
|
|
%1 = catchpad within %0 [ptr null, i32 64, ptr null]
|
|
catchret from %1 to label %exit
|
|
|
|
exit:
|
|
ret i32 %c.0.lcssa
|
|
|
|
for.inc: ; preds = %for.cond
|
|
%inc = add nsw nuw i32 %c.0, 1
|
|
br label %for.cond
|
|
}
|
|
|
|
declare void @fn1(i64 %idxprom)
|
|
|
|
declare i32 @__CxxFrameHandler3(...)
|