1 ; RUN: opt -S -basicaa -licm < %s | FileCheck %s 2 ; RUN: opt -aa-pipeline=basic-aa -passes='lcssa,require<aa>,require<targetir>,require<scalar-evolution>,loop(licm)' -S %s | FileCheck %s 3 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4 target triple = "x86_64-unknown-linux-gnu" 5 6 declare void @f() nounwind 7 8 ; Don't hoist load past nounwind call. 9 define i32 @test1(i32* noalias nocapture readonly %a) nounwind uwtable { 10 ; CHECK-LABEL: @test1( 11 entry: 12 br label %for.body 13 14 ; CHECK: tail call void @f() 15 ; CHECK-NEXT: load i32 16 for.body: 17 %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 18 %x.05 = phi i32 [ 0, %entry ], [ %add, %for.body ] 19 tail call void @f() nounwind 20 %i1 = load i32, i32* %a, align 4 21 %add = add nsw i32 %i1, %x.05 22 %inc = add nuw nsw i32 %i.06, 1 23 %exitcond = icmp eq i32 %inc, 1000 24 br i1 %exitcond, label %for.cond.cleanup, label %for.body 25 26 for.cond.cleanup: 27 ret i32 %add 28 } 29 30 ; Don't hoist division past nounwind call. 31 define i32 @test2(i32 %N, i32 %c) nounwind uwtable { 32 ; CHECK-LABEL: @test2( 33 entry: 34 %cmp4 = icmp sgt i32 %N, 0 35 br i1 %cmp4, label %for.body, label %for.cond.cleanup 36 37 ; CHECK: tail call void @f() 38 ; CHECK-NEXT: sdiv i32 39 for.body: 40 %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 41 tail call void @f() nounwind 42 %div = sdiv i32 5, %c 43 %add = add i32 %i.05, 1 44 %inc = add i32 %add, %div 45 %cmp = icmp slt i32 %inc, %N 46 br i1 %cmp, label %for.body, label %for.cond.cleanup 47 48 for.cond.cleanup: 49 ret i32 0 50 } 51 52 ; Don't hoist load past volatile load. 53 define i32 @test3(i32* noalias nocapture readonly %a, i32* %v) nounwind uwtable { 54 ; CHECK-LABEL: @test3( 55 entry: 56 br label %for.body 57 58 ; CHECK: load volatile i32 59 ; CHECK-NEXT: load i32 60 for.body: 61 %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 62 %x.05 = phi i32 [ 0, %entry ], [ %add, %for.body ] 63 %xxx = load volatile i32, i32* %v, align 4 64 %i1 = load i32, i32* %a, align 4 65 %add = add nsw i32 %i1, %x.05 66 %inc = add nuw nsw i32 %i.06, 1 67 %exitcond = icmp eq i32 %inc, 1000 68 br i1 %exitcond, label %for.cond.cleanup, label %for.body 69 70 for.cond.cleanup: 71 ret i32 %add 72 } 73