1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -gvn -S %s | FileCheck %s
3
4; Test for PR46054. Make sure we correctly invalidate MemoryDependenceAnalysis,
5; after removing a nonlocaldef.
6
7target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
8
9define void @test_double(double* %data) {
10; CHECK-LABEL: @test_double(
11; CHECK-NEXT:  entry:
12; CHECK-NEXT:    [[LUC:%.*]] = tail call noalias nonnull i64* @data()
13; CHECK-NEXT:    store i64 1, i64* [[LUC]], align 8, !invariant.group !0
14; CHECK-NEXT:    call void @fn(i64 1)
15; CHECK-NEXT:    br i1 true, label [[A:%.*]], label [[ENTRY_B_CRIT_EDGE:%.*]]
16; CHECK:       entry.B_crit_edge:
17; CHECK-NEXT:    br label [[B:%.*]]
18; CHECK:       A:
19; CHECK-NEXT:    br label [[B]]
20; CHECK:       B:
21; CHECK-NEXT:    call void @fn(i64 1)
22; CHECK-NEXT:    ret void
23;
24entry:
25  %luc = tail call noalias nonnull i64* @data()
26  store i64 1, i64* %luc, !invariant.group !0
27  %QQ = load i64, i64* %luc, !invariant.group !0
28  call void @fn(i64 %QQ)
29  br i1 true, label %A, label %B
30
31A:                                                ; preds = %loop
32  br label %B
33
34B:                                                ; preds = %A, %loop
35  %QQ.1 = load i64, i64* %luc, !invariant.group !0
36  call void @fn(i64 %QQ.1)
37  ret void
38}
39
40declare void @fn(i64)
41
42declare noalias i64* @data()
43
44
45define void @test_double_ptr(double** %data) {
46; CHECK-LABEL: @test_double_ptr(
47; CHECK-NEXT:  entry:
48; CHECK-NEXT:    [[LUC:%.*]] = tail call noalias nonnull i64** @data.ptr()
49; CHECK-NEXT:    store i64* null, i64** [[LUC]], align 8, !invariant.group !0
50; CHECK-NEXT:    call void @fn.ptr(i64* null)
51; CHECK-NEXT:    br i1 true, label [[A:%.*]], label [[ENTRY_B_CRIT_EDGE:%.*]]
52; CHECK:       entry.B_crit_edge:
53; CHECK-NEXT:    br label [[B:%.*]]
54; CHECK:       A:
55; CHECK-NEXT:    br label [[B]]
56; CHECK:       B:
57; CHECK-NEXT:    call void @fn.ptr(i64* null)
58; CHECK-NEXT:    ret void
59;
60entry:
61  %luc = tail call noalias nonnull i64** @data.ptr()
62  store i64* null, i64** %luc, !invariant.group !0
63  %QQ = load i64*, i64** %luc, !invariant.group !0
64  call void @fn.ptr(i64* %QQ)
65  br i1 true, label %A, label %B
66
67A:                                                ; preds = %loop
68  br label %B
69
70B:                                                ; preds = %A, %loop
71  %QQ.1 = load i64*, i64** %luc, !invariant.group !0
72  call void @fn.ptr(i64* %QQ.1)
73  ret void
74}
75
76
77declare void @fn.ptr(i64 *)
78
79declare noalias i64** @data.ptr()
80
81!0 = distinct !{}
82