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