[gn build] Port b9a2658a3e8b
[llvm-project.git] / llvm / test / Transforms / IndVarSimplify / hoist-wide-inc-for-narrow-use-recompute-flags.ll
blob1135ca9dbf00dc865f132b6b212d19570e8bea73
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:%.*]]) {
11 ; CHECK-NEXT:  entry:
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:%.*]]
25 ; CHECK:       inner.latch:
26 ; CHECK-NEXT:    br i1 false, label [[INNER_HEADER]], label [[OUTER_LATCH]]
27 ; CHECK:       outer.latch:
28 ; CHECK-NEXT:    br label [[OUTER_HEADER]]
29 ; CHECK:       exit:
30 ; CHECK-NEXT:    ret void
32 entry:
33   br label %outer.header
35 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
45 inner.header:
46   store i32 0, ptr %gep.shl, align 4
47   br i1 false, label %inner.latch, label %exit
49 inner.latch:
50   br i1 false, label %inner.header, label %outer.latch
52 outer.latch:
53   %iv.next = add i32 %iv, -1
54   br label %outer.header
56 exit:
57   ret void