134 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes2; RUN: opt -aa-pipeline=basic-aa,globals-aa -passes='require<globals-aa>,gvn' -S < %s | FileCheck %s3 4; Make sure we do not hoist the load before the intrinsic, unknown function, or5; optnone function except if we know the unknown function is nosync and nocallback.6 7@G1 = internal global i32 undef8@G2 = internal global i32 undef9@G3 = internal global i32 undef10@G4 = internal global i32 undef11 12define void @test_barrier(i1 %c) {13; CHECK-LABEL: define {{[^@]+}}@test_barrier14; CHECK-SAME: (i1 [[C:%.*]]) {15; CHECK-NEXT: br i1 [[C]], label [[INIT:%.*]], label [[CHECK:%.*]]16; CHECK: init:17; CHECK-NEXT: store i32 0, ptr @G1, align 418; CHECK-NEXT: br label [[CHECK]]19; CHECK: check:20; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()21; CHECK-NEXT: [[V:%.*]] = load i32, ptr @G1, align 422; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V]], 023; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])24; CHECK-NEXT: ret void25;26 br i1 %c, label %init, label %check27init:28 store i32 0, ptr @G129 br label %check30check:31 call void @llvm.amdgcn.s.barrier()32 %v = load i32, ptr @G133 %cmp = icmp eq i32 %v, 034 call void @llvm.assume(i1 %cmp)35 ret void36}37 38define void @test_unknown(i1 %c) {39; CHECK-LABEL: define {{[^@]+}}@test_unknown40; CHECK-SAME: (i1 [[C:%.*]]) {41; CHECK-NEXT: br i1 [[C]], label [[INIT:%.*]], label [[CHECK:%.*]]42; CHECK: init:43; CHECK-NEXT: store i32 0, ptr @G2, align 444; CHECK-NEXT: br label [[CHECK]]45; CHECK: check:46; CHECK-NEXT: call void @unknown()47; CHECK-NEXT: [[V:%.*]] = load i32, ptr @G2, align 448; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V]], 049; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])50; CHECK-NEXT: ret void51;52 br i1 %c, label %init, label %check53init:54 store i32 0, ptr @G255 br label %check56check:57 call void @unknown()58 %v = load i32, ptr @G259 %cmp = icmp eq i32 %v, 060 call void @llvm.assume(i1 %cmp)61 ret void62}63 64define void @test_optnone(i1 %c) {65; CHECK-LABEL: define {{[^@]+}}@test_optnone66; CHECK-SAME: (i1 [[C:%.*]]) {67; CHECK-NEXT: br i1 [[C]], label [[INIT:%.*]], label [[CHECK:%.*]]68; CHECK: init:69; CHECK-NEXT: store i32 0, ptr @G3, align 470; CHECK-NEXT: br label [[CHECK]]71; CHECK: check:72; CHECK-NEXT: call void @optnone()73; CHECK-NEXT: [[V:%.*]] = load i32, ptr @G3, align 474; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V]], 075; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])76; CHECK-NEXT: ret void77;78 br i1 %c, label %init, label %check79init:80 store i32 0, ptr @G381 br label %check82check:83 call void @optnone()84 %v = load i32, ptr @G385 %cmp = icmp eq i32 %v, 086 call void @llvm.assume(i1 %cmp)87 ret void88}89 90define void @optnone() optnone nosync nocallback noinline {91; CHECK: Function Attrs: nocallback noinline nosync optnone92; CHECK-LABEL: define {{[^@]+}}@optnone93; CHECK-SAME: () #[[ATTR0:[0-9]+]] {94; CHECK-NEXT: ret void95;96 ret void97}98 99; Here hoisting is legal and we use it to verify it will happen.100define void @test_unknown_annotated(i1 %c) {101; CHECK-LABEL: define {{[^@]+}}@test_unknown_annotated102; CHECK-SAME: (i1 [[C:%.*]]) {103; CHECK-NEXT: br i1 [[C]], label [[INIT:%.*]], label [[DOTCHECK_CRIT_EDGE:%.*]]104; CHECK: .check_crit_edge:105; CHECK-NEXT: [[V_PRE:%.*]] = load i32, ptr @G4, align 4106; CHECK-NEXT: br label [[CHECK:%.*]]107; CHECK: init:108; CHECK-NEXT: store i32 0, ptr @G4, align 4109; CHECK-NEXT: br label [[CHECK]]110; CHECK: check:111; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[V_PRE]], [[DOTCHECK_CRIT_EDGE]] ], [ 0, [[INIT]] ]112; CHECK-NEXT: call void @unknown_nosync_nocallback()113; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V]], 0114; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])115; CHECK-NEXT: ret void116;117 br i1 %c, label %init, label %check118init:119 store i32 0, ptr @G4120 br label %check121check:122 call void @unknown_nosync_nocallback()123 %v = load i32, ptr @G4124 %cmp = icmp eq i32 %v, 0125 call void @llvm.assume(i1 %cmp)126 ret void127}128 129declare void @unknown()130declare void @unknown_nosync_nocallback() nosync nocallback131declare void @llvm.amdgcn.s.barrier()132declare void @llvm.assume(i1 noundef)133 134