1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=gvn -S < %s | FileCheck %s 3 4; Check that PRE-LOAD across backedge does not 5; result in invalid dominator tree. 6declare void @use(i32) 7 8define void @test1(i1 %c, i32 %arg) { 9; CHECK-LABEL: @test1( 10; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[DOTBB2_CRIT_EDGE:%.*]] 11; CHECK: .bb2_crit_edge: 12; CHECK-NEXT: [[DOTPRE:%.*]] = shl i32 [[ARG:%.*]], 2 13; CHECK-NEXT: br label [[BB2:%.*]] 14; CHECK: bb1: 15; CHECK-NEXT: [[SHL1:%.*]] = shl i32 [[ARG]], 2 16; CHECK-NEXT: br label [[BB3:%.*]] 17; CHECK: bb2: 18; CHECK-NEXT: [[SHL2_PRE_PHI:%.*]] = phi i32 [ [[DOTPRE]], [[DOTBB2_CRIT_EDGE]] ], [ [[SHL3:%.*]], [[BB3]] ] 19; CHECK-NEXT: call void @use(i32 [[SHL2_PRE_PHI]]) 20; CHECK-NEXT: br label [[BB3]] 21; CHECK: bb3: 22; CHECK-NEXT: [[SHL3]] = shl i32 [[ARG]], 2 23; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr null, i32 [[SHL3]] 24; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[GEP]], align 4 25; CHECK-NEXT: call void @use(i32 [[V]]) 26; CHECK-NEXT: br label [[BB2]] 27; 28 br i1 %c, label %bb1, label %bb2 29 30bb1: 31 %shl1 = shl i32 %arg, 2 32 br label %bb3 33 34bb2: 35 %shl2 = shl i32 %arg, 2 36 call void @use(i32 %shl2) 37 br label %bb3 38 39bb3: 40 %shl3 = shl i32 %arg, 2 41 %gep = getelementptr i32, ptr null, i32 %shl3 42 %v = load i32, ptr %gep, align 4 43 call void @use(i32 %v) 44 br label %bb2 45} 46