; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 ; RUN: opt %s -passes=newgvn -S | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" define ptr @test1(ptr %v0, ptr %v1) { ; CHECK-LABEL: define ptr @test1 ; CHECK-SAME: (ptr [[V0:%.*]], ptr [[V1:%.*]]) { ; CHECK-NEXT: top: ; CHECK-NEXT: [[V2:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: store ptr [[V2]], ptr [[V1]], align 8 ; CHECK-NEXT: ret ptr [[V2]] ; top: %v2 = load ptr, ptr %v0, !nonnull !0 store ptr %v2, ptr %v1 %v3 = load ptr, ptr %v1 ret ptr %v3 } ; FIXME: could propagate nonnull to first load? define ptr @test2(ptr %v0, ptr %v1) { ; CHECK-LABEL: define ptr @test2 ; CHECK-SAME: (ptr [[V0:%.*]], ptr [[V1:%.*]]) { ; CHECK-NEXT: top: ; CHECK-NEXT: [[V2:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: store ptr [[V2]], ptr [[V1]], align 8 ; CHECK-NEXT: ret ptr [[V2]] ; top: %v2 = load ptr, ptr %v0 store ptr %v2, ptr %v1 %v3 = load ptr, ptr %v1, !nonnull !0 ret ptr %v3 } declare void @use1(ptr %a) readonly define ptr @test3(ptr %v0) { ; CHECK-LABEL: define ptr @test3 ; CHECK-SAME: (ptr [[V0:%.*]]) { ; CHECK-NEXT: top: ; CHECK-NEXT: [[V1:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: call void @use1(ptr [[V1]]) ; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: ret ptr [[V1]] ; CHECK: bb2: ; CHECK-NEXT: ret ptr [[V1]] ; top: %v1 = load ptr, ptr %v0 call void @use1(ptr %v1) br i1 undef, label %bb1, label %bb2 bb1: %v2 = load ptr, ptr %v0, !nonnull !0 ret ptr %v2 bb2: %v3 = load ptr, ptr %v0 ret ptr %v3 } define ptr @test4(ptr %v0) { ; CHECK-LABEL: define ptr @test4 ; CHECK-SAME: (ptr [[V0:%.*]]) { ; CHECK-NEXT: top: ; CHECK-NEXT: [[V1:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: call void @use1(ptr [[V1]]) ; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: ret ptr [[V1]] ; CHECK: bb2: ; CHECK-NEXT: ret ptr [[V1]] ; top: %v1 = load ptr, ptr %v0 call void @use1(ptr %v1) br i1 undef, label %bb1, label %bb2 bb1: %v2 = load ptr, ptr %v0 ret ptr %v2 bb2: %v3 = load ptr, ptr %v0, !nonnull !0 ret ptr %v3 } define ptr @test5(ptr %v0) { ; CHECK-LABEL: define ptr @test5 ; CHECK-SAME: (ptr [[V0:%.*]]) { ; CHECK-NEXT: top: ; CHECK-NEXT: [[V1:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: call void @use1(ptr [[V1]]) ; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: ret ptr [[V1]] ; CHECK: bb2: ; CHECK-NEXT: ret ptr [[V1]] ; top: %v1 = load ptr, ptr %v0, !nonnull !0 call void @use1(ptr %v1) br i1 undef, label %bb1, label %bb2 bb1: %v2 = load ptr, ptr %v0 ret ptr %v2 bb2: %v3 = load ptr, ptr %v0 ret ptr %v3 } define ptr @test6(ptr %v0, ptr %v1) { ; CHECK-LABEL: define ptr @test6 ; CHECK-SAME: (ptr [[V0:%.*]], ptr [[V1:%.*]]) { ; CHECK-NEXT: top: ; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: [[V2:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: store ptr [[V2]], ptr [[V1]], align 8 ; CHECK-NEXT: ret ptr [[V2]] ; CHECK: bb2: ; CHECK-NEXT: [[V4:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: store ptr [[V4]], ptr [[V1]], align 8 ; CHECK-NEXT: ret ptr [[V4]] ; top: br i1 undef, label %bb1, label %bb2 bb1: %v2 = load ptr, ptr %v0, !nonnull !0 store ptr %v2, ptr %v1 %v3 = load ptr, ptr %v1 ret ptr %v3 bb2: %v4 = load ptr, ptr %v0 store ptr %v4, ptr %v1 %v5 = load ptr, ptr %v1, !nonnull !0 ret ptr %v5 } declare void @use2(ptr %a) define ptr @test7(ptr %v0) { ; CHECK-LABEL: define ptr @test7 ; CHECK-SAME: (ptr [[V0:%.*]]) { ; CHECK-NEXT: top: ; CHECK-NEXT: [[V1:%.*]] = load ptr, ptr [[V0]], align 8, !nonnull !0 ; CHECK-NEXT: call void @use2(ptr [[V1]]) ; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: [[V2:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: ret ptr [[V2]] ; CHECK: bb2: ; CHECK-NEXT: [[V3:%.*]] = load ptr, ptr [[V0]], align 8 ; CHECK-NEXT: ret ptr [[V3]] ; top: %v1 = load ptr, ptr %v0, !nonnull !0 call void @use2(ptr %v1) br i1 undef, label %bb1, label %bb2 bb1: %v2 = load ptr, ptr %v0 ret ptr %v2 bb2: %v3 = load ptr, ptr %v0 ret ptr %v3 } !0 = !{}