1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt -S -passes=gvn < %s | FileCheck %s 3 4; Make sure the two offsets from the phi don't get merged incorrectly. 5define i8 @test(i1 %c, i64 %offset, ptr %ptr) { 6; CHECK-LABEL: define i8 @test 7; CHECK-SAME: (i1 [[C:%.*]], i64 [[OFFSET:%.*]], ptr [[PTR:%.*]]) { 8; CHECK-NEXT: start: 9; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [8 x i8], align 8 10; CHECK-NEXT: store i64 1234605616436508552, ptr [[ALLOCA]], align 8 11; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr i8, ptr [[ALLOCA]], i64 2 12; CHECK-NEXT: [[GEP_UNKNOWN:%.*]] = getelementptr i8, ptr [[ALLOCA]], i64 [[OFFSET]] 13; CHECK-NEXT: br i1 [[C]], label [[JOIN:%.*]], label [[IF:%.*]] 14; CHECK: if: 15; CHECK-NEXT: br label [[JOIN]] 16; CHECK: join: 17; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[GEP_UNKNOWN]], [[START:%.*]] ], [ [[GEP_2]], [[IF]] ] 18; CHECK-NEXT: store i8 0, ptr [[ALLOCA]], align 8 19; CHECK-NEXT: [[LOAD1:%.*]] = load i64, ptr [[ALLOCA]], align 8 20; CHECK-NEXT: store i64 [[LOAD1]], ptr [[PTR]], align 8 21; CHECK-NEXT: [[LOAD2:%.*]] = load i8, ptr [[PHI]], align 1 22; CHECK-NEXT: ret i8 [[LOAD2]] 23; 24start: 25 %alloca = alloca [8 x i8], align 8 26 store i64 u0x1122334455667788, ptr %alloca, align 8 27 %gep.2 = getelementptr i8, ptr %alloca, i64 2 28 %gep.unknown = getelementptr i8, ptr %alloca, i64 %offset 29 br i1 %c, label %join, label %if 30 31if: 32 br label %join 33 34join: 35 %phi = phi ptr [ %gep.unknown, %start ], [ %gep.2, %if ] 36 store i8 0, ptr %alloca, align 8 37 %load1 = load i64, ptr %alloca, align 8 38 store i64 %load1, ptr %ptr, align 8 39 %load2 = load i8, ptr %phi, align 1 40 ret i8 %load2 41} 42