Home | History | Annotate | Download | only in LICM
      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