1; RUN: opt < %s -S -basicaa -licm | FileCheck %s 2 3; Check that we can hoist unordered loads 4define i32 @test1(i32* nocapture %y) nounwind uwtable ssp { 5entry: 6 br label %loop 7 8loop: 9 %i = phi i32 [ %inc, %loop ], [ 0, %entry ] 10 %val = load atomic i32* %y unordered, align 4 11 %inc = add nsw i32 %i, 1 12 %exitcond = icmp eq i32 %inc, %val 13 br i1 %exitcond, label %end, label %loop 14 15end: 16 ret i32 %val 17; CHECK: define i32 @test1( 18; CHECK: load atomic 19; CHECK-NEXT: br label %loop 20} 21 22; Check that we don't sink/hoist monotonic loads 23; (Strictly speaking, it's not forbidden, but it's supposed to be possible to 24; use monotonic for spinlock-like constructs.) 25define i32 @test2(i32* nocapture %y) nounwind uwtable ssp { 26entry: 27 br label %loop 28 29loop: 30 %val = load atomic i32* %y monotonic, align 4 31 %exitcond = icmp ne i32 %val, 0 32 br i1 %exitcond, label %end, label %loop 33 34end: 35 ret i32 %val 36; CHECK: define i32 @test2( 37; CHECK: load atomic 38; CHECK-NEXT: %exitcond = icmp ne 39; CHECK-NEXT: br i1 %exitcond, label %end, label %loop 40} 41 42; Check that we hoist unordered around monotonic. 43; (The noalias shouldn't be necessary in theory, but LICM isn't quite that 44; smart yet.) 45define i32 @test3(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp { 46entry: 47 br label %loop 48 49loop: 50 %vala = load atomic i32* %y monotonic, align 4 51 %valb = load atomic i32* %x unordered, align 4 52 %exitcond = icmp ne i32 %vala, %valb 53 br i1 %exitcond, label %end, label %loop 54 55end: 56 ret i32 %vala 57; CHECK: define i32 @test3( 58; CHECK: load atomic i32* %x unordered 59; CHECK-NEXT: br label %loop 60} 61 62; Don't try to "sink" unordered stores yet; it is legal, but the machinery 63; isn't there. 64define i32 @test4(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp { 65entry: 66 br label %loop 67 68loop: 69 %vala = load atomic i32* %y monotonic, align 4 70 store atomic i32 %vala, i32* %x unordered, align 4 71 %exitcond = icmp ne i32 %vala, 0 72 br i1 %exitcond, label %end, label %loop 73 74end: 75 ret i32 %vala 76; CHECK: define i32 @test4( 77; CHECK: load atomic i32* %y monotonic 78; CHECK-NEXT: store atomic 79} 80