1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2 ; RUN: opt -p indvars -S %s | FileCheck %s
4 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6 ; Test for https://github.com/llvm/llvm-project/issues/82243.
7 ; Check that NUW flag on hoisted wide IV is dropped properly.
8 define void @test_pr82243(ptr %f) {
9 ; CHECK-LABEL: define void @test_pr82243(
10 ; CHECK-SAME: ptr [[F:%.*]]) {
12 ; CHECK-NEXT: br label [[OUTER_HEADER:%.*]]
13 ; CHECK: outer.header:
14 ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OUTER_LATCH:%.*]] ], [ 1, [[ENTRY:%.*]] ]
15 ; CHECK-NEXT: [[GEP_IV_EXT:%.*]] = getelementptr i32, ptr [[F]], i64 [[INDVARS_IV]]
16 ; CHECK-NEXT: store i32 1, ptr [[GEP_IV_EXT]], align 4
17 ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], -1
18 ; CHECK-NEXT: [[TMP0:%.*]] = trunc nuw nsw i64 [[INDVARS_IV_NEXT]] to i32
19 ; CHECK-NEXT: [[SHL:%.*]] = shl i32 123, [[TMP0]]
20 ; CHECK-NEXT: [[GEP_SHL:%.*]] = getelementptr i32, ptr [[F]], i32 [[SHL]]
21 ; CHECK-NEXT: br label [[INNER_HEADER:%.*]]
22 ; CHECK: inner.header:
23 ; CHECK-NEXT: store i32 0, ptr [[GEP_SHL]], align 4
24 ; CHECK-NEXT: br i1 false, label [[INNER_LATCH:%.*]], label [[EXIT:%.*]]
26 ; CHECK-NEXT: br i1 false, label [[INNER_HEADER]], label [[OUTER_LATCH]]
28 ; CHECK-NEXT: br label [[OUTER_HEADER]]
30 ; CHECK-NEXT: ret void
33 br label %outer.header
36 %iv = phi i32 [ 1, %entry ], [ %iv.next, %outer.latch ]
37 %iv.sext = sext i32 %iv to i64
38 %gep.iv.ext = getelementptr i32, ptr %f, i64 %iv.sext
39 store i32 1, ptr %gep.iv.ext
40 %sub = add i32 %iv, -1
41 %shl = shl i32 123, %sub
42 %gep.shl = getelementptr i32, ptr %f, i32 %shl
43 br label %inner.header
46 store i32 0, ptr %gep.shl, align 4
47 br i1 false, label %inner.latch, label %exit
50 br i1 false, label %inner.header, label %outer.latch
53 %iv.next = add i32 %iv, -1
54 br label %outer.header