| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt -S -passes=gvn < %s | FileCheck %s | |
| ; https://github.com/llvm/llvm-project/issues/59679 | |
| ; Make sure we don't replace the %ptr in the if.then branch with @x and then | |
| ; conclude that it can't alias with the read from the noalias pointer %ptr. | |
| @x = global i32 0 | |
| define i32 @test(ptr noalias %ptr) { | |
| ; CHECK-LABEL: define i32 @test( | |
| ; CHECK-SAME: ptr noalias [[PTR:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*]]: | |
| ; CHECK-NEXT: store i32 1, ptr [[PTR]], align 4 | |
| ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[PTR]], @x | |
| ; CHECK-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]] | |
| ; CHECK: [[IF_THEN]]: | |
| ; CHECK-NEXT: store i32 2, ptr [[PTR]], align 4 | |
| ; CHECK-NEXT: br label %[[IF_END]] | |
| ; CHECK: [[IF_END]]: | |
| ; CHECK-NEXT: [[V:%.*]] = phi i32 [ 2, %[[IF_THEN]] ], [ 1, %[[ENTRY]] ] | |
| ; CHECK-NEXT: ret i32 [[V]] | |
| ; | |
| entry: | |
| store i32 1, ptr %ptr | |
| %cmp = icmp eq ptr %ptr, @x | |
| br i1 %cmp, label %if.then, label %if.end | |
| if.then: | |
| store i32 2, ptr %ptr | |
| br label %if.end | |
| if.end: | |
| %v = load i32, ptr %ptr | |
| ret i32 %v | |
| } |