; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt < %s -passes=gvn -S | FileCheck %s ; loop.then is not reachable from loop, so we should be able to deduce that the ; store through %phi2 cannot alias %ptr1. define void @test1(ptr %ptr1, ptr %ptr2) { ; CHECK-LABEL: define void @test1( ; CHECK-SAME: ptr [[PTR1:%.*]], ptr [[PTR2:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr [[PTR1]], i64 1 ; CHECK-NEXT: [[VAL1_PRE:%.*]] = load i32, ptr [[GEP1]], align 4 ; CHECK-NEXT: br label %[[LOOP:.*]] ; CHECK: [[LOOP]]: ; CHECK-NEXT: [[PHI1:%.*]] = phi ptr [ [[GEP1]], %[[ENTRY]] ], [ [[PHI2:%.*]], %[[LOOP_THEN:.*]] ] ; CHECK-NEXT: br i1 false, label %[[LOOP_LOOP_THEN_CRIT_EDGE:.*]], label %[[LOOP_IF:.*]] ; CHECK: [[LOOP_LOOP_THEN_CRIT_EDGE]]: ; CHECK-NEXT: br label %[[LOOP_THEN]] ; CHECK: [[LOOP_IF]]: ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i32, ptr [[GEP1]], i64 1 ; CHECK-NEXT: [[VAL2:%.*]] = load i32, ptr [[GEP2]], align 4 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[VAL1_PRE]], [[VAL2]] ; CHECK-NEXT: br label %[[LOOP_THEN]] ; CHECK: [[LOOP_THEN]]: ; CHECK-NEXT: [[PHI2]] = phi ptr [ poison, %[[LOOP_LOOP_THEN_CRIT_EDGE]] ], [ [[GEP2]], %[[LOOP_IF]] ] ; CHECK-NEXT: store i32 [[VAL1_PRE]], ptr [[PHI2]], align 4 ; CHECK-NEXT: store i32 0, ptr [[PTR1]], align 4 ; CHECK-NEXT: br label %[[LOOP]] ; entry: br label %loop.preheader loop.preheader: %gep1 = getelementptr inbounds i32, ptr %ptr1, i64 1 br label %loop loop: %phi1 = phi ptr [ %gep1, %loop.preheader ], [ %phi2, %loop.then ] %val1 = load i32, ptr %phi1 br i1 false, label %loop.then, label %loop.if loop.if: %gep2 = getelementptr inbounds i32, ptr %gep1, i64 1 %val2 = load i32, ptr %gep2 %cmp = icmp slt i32 %val1, %val2 br label %loop.then loop.then: %phi2 = phi ptr [ %ptr2, %loop ], [ %gep2, %loop.if ] store i32 %val1, ptr %phi2 store i32 0, ptr %ptr1 br label %loop }