brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.7 KiB · 2042855 Raw
412 lines · plain
1; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa-walker>' -verify-memoryssa < %s 2>&1 | FileCheck %s2 3@g = external global i324 5; CHECK-LABEL: define {{.*}} @global(6define i32 @global() {7; CHECK: 1 = MemoryDef(liveOnEntry)8; CHECK-NEXT: store i32 09  store i32 0, ptr @g, align 4, !invariant.group !010 11; CHECK: 2 = MemoryDef(1)12; CHECK-NEXT: call void @clobber13  call void @clobber(ptr @g)14 15; FIXME: this could be clobbered by 1 if we walked the instruction list for loads/stores to @g.16; But we can't look at the uses of @g in a function analysis.17; CHECK: MemoryUse(2) {{.*}} clobbered by 218; CHECK-NEXT: %1 = load i3219  %1 = load i32, ptr @g, align 4, !invariant.group !020  ret i32 %121}22 23; CHECK-LABEL: define {{.*}} @global2(24define i32 @global2() {25; CHECK: 1 = MemoryDef(liveOnEntry)26; CHECK-NEXT: store i32 027  store i32 0, ptr inttoptr (i64 ptrtoint (ptr @g to i64) to ptr), align 4, !invariant.group !028 29; CHECK: 2 = MemoryDef(1)30; CHECK-NEXT: call void @clobber31  call void @clobber(ptr inttoptr (i64 ptrtoint (ptr @g to i64) to ptr))32 33; FIXME: this could be clobbered by 1 if we walked the instruction list for loads/stores to @g.34; But we can't look at the uses of @g in a function analysis.35; CHECK: MemoryUse(2) {{.*}} clobbered by 236; CHECK-NEXT: %1 = load i3237  %1 = load i32, ptr inttoptr (i64 ptrtoint (ptr @g to i64) to ptr), align 4, !invariant.group !038  ret i32 %139}40 41; CHECK-LABEL: define {{.*}} @foo(42define i32 @foo(ptr %a) {43; CHECK: 1 = MemoryDef(liveOnEntry)44; CHECK-NEXT: store i32 045  store i32 0, ptr %a, align 4, !invariant.group !046 47; CHECK: 2 = MemoryDef(1)48; CHECK-NEXT: store i32 149  store i32 1, ptr @g, align 450 51; CHECK:  3 = MemoryDef(2)52; CHECK-NEXT: %a8 = call ptr @llvm.launder.invariant.group.p0(ptr %a)53  %a8 = call ptr @llvm.launder.invariant.group.p0(ptr %a)54 55; This have to be MemoryUse(2), because we can't skip the barrier based on56; invariant.group.57; CHECK: MemoryUse(2)58; CHECK-NEXT: %1 = load i3259  %1 = load i32, ptr %a8, align 4, !invariant.group !060  ret i32 %161}62 63; CHECK-LABEL: define {{.*}} @volatile1(64define void @volatile1(ptr %a) {65; CHECK: 1 = MemoryDef(liveOnEntry)66; CHECK-NEXT: store i32 067  store i32 0, ptr %a, align 4, !invariant.group !068 69; CHECK: 2 = MemoryDef(1)70; CHECK-NEXT: call void @clobber71  call void @clobber(ptr %a)72 73; CHECK: 3 = MemoryDef(2){{.*}} clobbered by 274; CHECK-NEXT: load volatile75  %b = load volatile i32, ptr %a, align 4, !invariant.group !076 77  ret void78}79 80; CHECK-LABEL: define {{.*}} @volatile2(81define void @volatile2(ptr %a) {82; CHECK: 1 = MemoryDef(liveOnEntry)83; CHECK-NEXT: store volatile i32 084  store volatile i32 0, ptr %a, align 4, !invariant.group !085 86; CHECK: 2 = MemoryDef(1)87; CHECK-NEXT: call void @clobber88  call void @clobber(ptr %a)89 90; CHECK: MemoryUse(2){{.*}} clobbered by 291; CHECK-NEXT: load i3292  %b = load i32, ptr %a, align 4, !invariant.group !093 94  ret void95}96 97; CHECK-LABEL: define {{.*}} @skipBarrier(98define i32 @skipBarrier(ptr %a) {99; CHECK: 1 = MemoryDef(liveOnEntry)100; CHECK-NEXT: store i32 0101  store i32 0, ptr %a, align 4, !invariant.group !0102 103; CHECK: 2 = MemoryDef(1)104; CHECK-NEXT: %a8 = call ptr @llvm.launder.invariant.group.p0(ptr %a)105  %a8 = call ptr @llvm.launder.invariant.group.p0(ptr %a)  106 107; We can skip the barrier only if the "skip" is not based on !invariant.group.108; CHECK: MemoryUse(1)109; CHECK-NEXT: %1 = load i32110  %1 = load i32, ptr %a8, align 4, !invariant.group !0111  ret i32 %1112}113 114; CHECK-LABEL: define {{.*}} @skipBarrier2(115define i32 @skipBarrier2(ptr %a) {116 117; CHECK: MemoryUse(liveOnEntry)118; CHECK-NEXT: %v = load i32119  %v = load i32, ptr %a, align 4, !invariant.group !0120 121; CHECK: 1 = MemoryDef(liveOnEntry)122; CHECK-NEXT: %a8 = call ptr @llvm.launder.invariant.group.p0(ptr %a)123  %a8 = call ptr @llvm.launder.invariant.group.p0(ptr %a)124 125; We can skip the barrier only if the "skip" is not based on !invariant.group.126; CHECK: MemoryUse(liveOnEntry)127; CHECK-NEXT: %v2 = load i32128  %v2 = load i32, ptr %a8, align 4, !invariant.group !0129; CHECK: 2 = MemoryDef(1)130; CHECK-NEXT: store i32 1131  store i32 1, ptr @g, align 4132 133; CHECK: MemoryUse(2) {{.*}} clobbered by liveOnEntry134; CHECK-NEXT: %v3 = load i32135  %v3 = load i32, ptr %a8, align 4, !invariant.group !0136  %add = add nsw i32 %v2, %v3137  %add2 = add nsw i32 %add, %v138  ret i32 %add2139}140 141; CHECK-LABEL: define {{.*}} @handleInvariantGroups(142define i32 @handleInvariantGroups(ptr %a) {143; CHECK: 1 = MemoryDef(liveOnEntry)144; CHECK-NEXT: store i32 0145  store i32 0, ptr %a, align 4, !invariant.group !0146 147; CHECK: 2 = MemoryDef(1)148; CHECK-NEXT: store i32 1149  store i32 1, ptr @g, align 4150; CHECK: 3 = MemoryDef(2)151; CHECK-NEXT: %a8 = call ptr @llvm.launder.invariant.group.p0(ptr %a)152  %a8 = call ptr @llvm.launder.invariant.group.p0(ptr %a)153 154; CHECK: MemoryUse(2)155; CHECK-NEXT: %1 = load i32156  %1 = load i32, ptr %a8, align 4, !invariant.group !0157 158; CHECK: 4 = MemoryDef(3)159; CHECK-NEXT: store i32 2160  store i32 2, ptr @g, align 4161 162; CHECK: MemoryUse(4) {{.*}} clobbered by 2163; CHECK-NEXT: %2 = load i32164  %2 = load i32, ptr %a8, align 4, !invariant.group !0165  %add = add nsw i32 %1, %2166  ret i32 %add167}168 169; CHECK-LABEL: define {{.*}} @loop(170define i32 @loop(i1 %a) {171entry:172  %0 = alloca i32, align 4173; CHECK: 1 = MemoryDef(liveOnEntry)174; CHECK-NEXT: store i32 4175  store i32 4, ptr %0, !invariant.group !0176; CHECK: 2 = MemoryDef(1)177; CHECK-NEXT: call void @clobber178  call void @clobber(ptr %0)179  br i1 %a, label %Loop.Body, label %Loop.End180 181Loop.Body:182; CHECK: MemoryUse(2) {{.*}} clobbered by 1183; CHECK-NEXT: %1 = load i32184  %1 = load i32, ptr %0, !invariant.group !0185  br i1 %a, label %Loop.End, label %Loop.Body186 187Loop.End:188; CHECK: MemoryUse(2) {{.*}} clobbered by 1189; CHECK-NEXT: %2 = load190  %2 = load i32, ptr %0, align 4, !invariant.group !0191  br i1 %a, label %Ret, label %Loop.Body192 193Ret:194  ret i32 %2195}196 197; CHECK-LABEL: define {{.*}} @loop2(198define i8 @loop2(ptr %p, i1 %arg) {199entry:200; CHECK: 1 = MemoryDef(liveOnEntry)201; CHECK-NEXT: store i8202  store i8 4, ptr %p, !invariant.group !0203; CHECK: 2 = MemoryDef(1)204; CHECK-NEXT: call void @clobber205  call void @clobber8(ptr %p)206 207; CHECK: 3 = MemoryDef(2)208; CHECK-NEXT: %after = call ptr @llvm.launder.invariant.group.p0(ptr %p)209  %after = call ptr @llvm.launder.invariant.group.p0(ptr %p)210  br i1 %arg, label %Loop.Body, label %Loop.End211 212Loop.Body:213; CHECK: MemoryUse(6)214; CHECK-NEXT: %0 = load i8215  %0 = load i8, ptr %after, !invariant.group !0216 217; CHECK: MemoryUse(6) {{.*}} clobbered by 1218; CHECK-NEXT: %1 = load i8219  %1 = load i8, ptr %p, !invariant.group !0220 221; CHECK: 4 = MemoryDef(6)222  store i8 4, ptr %after, !invariant.group !0223 224  br i1 %arg, label %Loop.End, label %Loop.Body225 226Loop.End:227; CHECK: MemoryUse(5)228; CHECK-NEXT: %2 = load229  %2 = load i8, ptr %after, align 4, !invariant.group !0230 231; CHECK: MemoryUse(5) {{.*}} clobbered by 1232; CHECK-NEXT: %3 = load233  %3 = load i8, ptr %p, align 4, !invariant.group !0234  br i1 %arg, label %Ret, label %Loop.Body235 236Ret:237  ret i8 %3238}239 240 241; CHECK-LABEL: define {{.*}} @loop3(242define i8 @loop3(ptr %p, i1 %arg) {243entry:244; CHECK: 1 = MemoryDef(liveOnEntry)245; CHECK-NEXT: store i8246  store i8 4, ptr %p, !invariant.group !0247; CHECK: 2 = MemoryDef(1)248; CHECK-NEXT: call void @clobber249  call void @clobber8(ptr %p)250 251; CHECK: 3 = MemoryDef(2)252; CHECK-NEXT: %after = call ptr @llvm.launder.invariant.group.p0(ptr %p)253  %after = call ptr @llvm.launder.invariant.group.p0(ptr %p)254  br i1 %arg, label %Loop.Body, label %Loop.End255 256Loop.Body:257; CHECK: MemoryUse(8)258; CHECK-NEXT: %0 = load i8259  %0 = load i8, ptr %after, !invariant.group !0260 261; CHECK: 4 = MemoryDef(8)262; CHECK-NEXT: call void @clobber8263  call void @clobber8(ptr %after)264 265; CHECK: MemoryUse(4) {{.*}} clobbered by 8266; CHECK-NEXT: %1 = load i8267  %1 = load i8, ptr %after, !invariant.group !0268 269  br i1 %arg, label %Loop.next, label %Loop.Body270Loop.next:271; CHECK: 5 = MemoryDef(4)272; CHECK-NEXT: call void @clobber8273  call void @clobber8(ptr %after)274 275; CHECK: MemoryUse(5) {{.*}} clobbered by 8276; CHECK-NEXT: %2 = load i8277  %2 = load i8, ptr %after, !invariant.group !0278 279  br i1 %arg, label %Loop.End, label %Loop.Body280 281Loop.End:282; CHECK: MemoryUse(7)283; CHECK-NEXT: %3 = load284  %3 = load i8, ptr %after, align 4, !invariant.group !0285 286; CHECK: 6 = MemoryDef(7)287; CHECK-NEXT: call void @clobber8288  call void @clobber8(ptr %after)289 290; CHECK: MemoryUse(6) {{.*}} clobbered by 7291; CHECK-NEXT: %4 = load292  %4 = load i8, ptr %after, align 4, !invariant.group !0293  br i1 %arg, label %Ret, label %Loop.Body294 295Ret:296  ret i8 %3297}298 299; CHECK-LABEL: define {{.*}} @loop4(300define i8 @loop4(ptr %p, i1 %arg) {301entry:302; CHECK: 1 = MemoryDef(liveOnEntry)303; CHECK-NEXT: store i8304  store i8 4, ptr %p, !invariant.group !0305; CHECK: 2 = MemoryDef(1)306; CHECK-NEXT: call void @clobber307  call void @clobber8(ptr %p)308; CHECK: 3 = MemoryDef(2)309; CHECK-NEXT: %after = call ptr @llvm.launder.invariant.group.p0(ptr %p)310  %after = call ptr @llvm.launder.invariant.group.p0(ptr %p)311  br i1 %arg, label %Loop.Pre, label %Loop.End312 313Loop.Pre:314; CHECK: MemoryUse(2)315; CHECK-NEXT: %0 = load i8316  %0 = load i8, ptr %after, !invariant.group !0317  br label %Loop.Body318Loop.Body:319; CHECK: MemoryUse(6)320; CHECK-NEXT: %1 = load i8321  %1 = load i8, ptr %after, !invariant.group !0322 323; CHECK: MemoryUse(6) {{.*}} clobbered by 1324; CHECK-NEXT: %2 = load i8325  %2 = load i8, ptr %p, !invariant.group !0326 327; CHECK: 4 = MemoryDef(6)328  store i8 4, ptr %after, !invariant.group !0329  br i1 %arg, label %Loop.End, label %Loop.Body330 331Loop.End:332; CHECK: MemoryUse(5)333; CHECK-NEXT: %3 = load334  %3 = load i8, ptr %after, align 4, !invariant.group !0335 336; CHECK: MemoryUse(5) {{.*}} clobbered by 1337; CHECK-NEXT: %4 = load338  %4 = load i8, ptr %p, align 4, !invariant.group !0339  br i1 %arg, label %Ret, label %Loop.Body340 341Ret:342  ret i8 %3343}344 345; In the future we would like to CSE barriers if there is no clobber between.346; CHECK-LABEL: define {{.*}} @optimizable(347define i8 @optimizable() {348entry:349  %ptr = alloca i8350; CHECK: 1 = MemoryDef(liveOnEntry)351; CHECK-NEXT: store i8 42, ptr %ptr, align 1, !invariant.group !0352  store i8 42, ptr %ptr, !invariant.group !0353; CHECK: 2 = MemoryDef(1)354; CHECK-NEXT: call ptr @llvm.launder.invariant.group355  %ptr2 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)356; FIXME: This one could be CSEd.357; CHECK: 3 = MemoryDef(2)358; CHECK: call ptr @llvm.launder.invariant.group359  %ptr3 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)360; CHECK: 4 = MemoryDef(3)361; CHECK-NEXT: call void @clobber8(ptr %ptr)362  call void @clobber8(ptr %ptr)363; CHECK: 5 = MemoryDef(4)364; CHECK-NEXT: call void @use(ptr %ptr2)365  call void @use(ptr %ptr2)366; CHECK: 6 = MemoryDef(5)367; CHECK-NEXT: call void @use(ptr %ptr3)368  call void @use(ptr %ptr3)369; CHECK: MemoryUse(6)370; CHECK-NEXT: load i8, ptr %ptr3, {{.*}}!invariant.group371  %v = load i8, ptr %ptr3, !invariant.group !0372 373  ret i8 %v374}375 376; CHECK-LABEL: define {{.*}} @unoptimizable2()377define i8 @unoptimizable2() {378  %ptr = alloca i8379; CHECK: 1 = MemoryDef(liveOnEntry)380; CHECK-NEXT: store i8 42, ptr %ptr, align 1, !invariant.group !0381  store i8 42, ptr %ptr, !invariant.group !0382; CHECK: 2 = MemoryDef(1)383; CHECK-NEXT: call ptr @llvm.launder.invariant.group384  %ptr2 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)385; CHECK: 3 = MemoryDef(2)386  store i8 43, ptr %ptr387; CHECK: 4 = MemoryDef(3)388; CHECK-NEXT: call ptr @llvm.launder.invariant.group389  %ptr3 = call ptr @llvm.launder.invariant.group.p0(ptr %ptr)390; CHECK: 5 = MemoryDef(4)391; CHECK-NEXT: call void @clobber8(ptr %ptr)392  call void @clobber8(ptr %ptr)393; CHECK: 6 = MemoryDef(5)394; CHECK-NEXT: call void @use(ptr %ptr2)395  call void @use(ptr %ptr2)396; CHECK: 7 = MemoryDef(6)397; CHECK-NEXT: call void @use(ptr %ptr3)398  call void @use(ptr %ptr3)399; CHECK: MemoryUse(7)400; CHECK-NEXT: %v = load i8, ptr %ptr3, align 1, !invariant.group !0401  %v = load i8, ptr %ptr3, !invariant.group !0402  ret i8 %v403}404 405 406declare ptr @llvm.launder.invariant.group.p0(ptr)407declare void @clobber(ptr)408declare void @clobber8(ptr)409declare void @use(ptr readonly)410 411!0 = !{!"group1"}412