104 lines · plain
1; RUN: opt -S -passes=early-cse -earlycse-debug-hash < %s | FileCheck %s2; RUN: opt -S -passes=gvn < %s | FileCheck %s3; RUN: opt -S -passes=newgvn < %s | FileCheck %s4 5; These tests checks if passes with CSE functionality can do CSE on6; launder.invariant.group, that is prohibited if there is a memory clobber7; between barriers call.8 9; CHECK-LABEL: define i8 @optimizable()10define i8 @optimizable() {11entry:12 %ptr = alloca i813 store i8 42, ptr %ptr, !invariant.group !014; CHECK: call ptr @llvm.launder.invariant.group.p015 %ptr2 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)16; FIXME: This one could be CSE17; CHECK: call ptr @llvm.launder.invariant.group18 %ptr3 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)19; CHECK: call void @clobber(ptr {{.*}}%ptr)20 call void @clobber(ptr %ptr)21 22; CHECK: call void @use(ptr {{.*}}%ptr2)23 call void @use(ptr %ptr2)24; CHECK: call void @use(ptr {{.*}}%ptr3)25 call void @use(ptr %ptr3)26; CHECK: load i8, ptr %ptr3, {{.*}}!invariant.group27 %v = load i8, ptr %ptr3, !invariant.group !028 29 ret i8 %v30}31 32; CHECK-LABEL: define i8 @unoptimizable()33define i8 @unoptimizable() {34entry:35 %ptr = alloca i836 store i8 42, ptr %ptr, !invariant.group !037; CHECK: call ptr @llvm.launder.invariant.group.p038 %ptr2 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)39 call void @clobber(ptr %ptr)40; CHECK: call ptr @llvm.launder.invariant.group.p041 %ptr3 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)42; CHECK: call void @clobber(ptr {{.*}}%ptr)43 call void @clobber(ptr %ptr)44; CHECK: call void @use(ptr {{.*}}%ptr2)45 call void @use(ptr %ptr2)46; CHECK: call void @use(ptr {{.*}}%ptr3)47 call void @use(ptr %ptr3)48; CHECK: load i8, ptr %ptr3, {{.*}}!invariant.group49 %v = load i8, ptr %ptr3, !invariant.group !050 51 ret i8 %v52}53 54; CHECK-LABEL: define i8 @unoptimizable2()55define i8 @unoptimizable2() {56 %ptr = alloca i857 store i8 42, ptr %ptr, !invariant.group !058; CHECK: call ptr @llvm.launder.invariant.group59 %ptr2 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)60 store i8 43, ptr %ptr61; CHECK: call ptr @llvm.launder.invariant.group62 %ptr3 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)63; CHECK: call void @clobber(ptr {{.*}}%ptr)64 call void @clobber(ptr %ptr)65; CHECK: call void @use(ptr {{.*}}%ptr2)66 call void @use(ptr %ptr2)67; CHECK: call void @use(ptr {{.*}}%ptr3)68 call void @use(ptr %ptr3)69; CHECK: load i8, ptr %ptr3, {{.*}}!invariant.group70 %v = load i8, ptr %ptr3, !invariant.group !071 ret i8 %v72}73 74; This test check if optimizer is not proving equality based on mustalias75; CHECK-LABEL: define void @dontProveEquality(ptr %a)76define void @dontProveEquality(ptr %a) {77 %b = call ptr @llvm.launder.invariant.group.p0(ptr %a)78 %r = icmp eq ptr %b, %a79; CHECK: call void @useBool(i1 %r)80 call void @useBool(i1 %r)81 82 %b2 = call ptr @llvm.strip.invariant.group.p0(ptr %a)83 %r2 = icmp eq ptr %b2, %a84; CHECK: call void @useBool(i1 %r2)85 call void @useBool(i1 %r2)86 87 ret void88}89 90declare void @use(ptr readonly)91declare void @useBool(i1)92 93declare void @clobber(ptr)94; CHECK: Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite){{$}}95; CHECK-NEXT: declare ptr @llvm.launder.invariant.group.p0(ptr)96declare ptr @llvm.launder.invariant.group.p0(ptr)97 98; CHECK: Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none){{$}}99; CHECK-NEXT: declare ptr @llvm.strip.invariant.group.p0(ptr)100declare ptr @llvm.strip.invariant.group.p0(ptr)101 102 103!0 = !{}104