xref: /llvm-project/llvm/test/Transforms/LICM/pr54495.ll (revision 80e8f2beeb954f8c241897099bb01b24da400e8a)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=licm < %s | FileCheck %s
3
4; Make sure that a store of a pointer to itself is handled correctly.
5
6define void @test(ptr %p1, ptr %p2, ptr noalias %p3) {
7; CHECK-LABEL: @test(
8; CHECK-NEXT:  entry:
9; CHECK-NEXT:    br label [[LOOP:%.*]]
10; CHECK:       loop:
11; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[P1:%.*]], [[ENTRY:%.*]] ], [ [[P2:%.*]], [[LOOP]] ]
12; CHECK-NEXT:    [[V:%.*]] = load i64, ptr [[P]], align 4
13; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[V]], 0
14; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP]], label [[LOOP_EXIT:%.*]]
15; CHECK:       loop.exit:
16; CHECK-NEXT:    store ptr [[P3:%.*]], ptr [[P3]], align 8
17; CHECK-NEXT:    ret void
18;
19entry:
20  br label %loop
21
22loop:
23  %p = phi ptr [ %p1, %entry ], [ %p2, %loop ]
24  %v = load i64, ptr %p
25  %cmp = icmp eq i64 %v, 0
26  store ptr %p3, ptr %p3
27  br i1 %cmp, label %loop, label %loop.exit
28
29loop.exit:
30  ret void
31}
32