1 ; RUN: opt -basicaa -memdep -mldst-motion -S < %s | FileCheck %s 2 ; RUN: opt -aa-pipeline=basic-aa -passes='require<memdep>',mldst-motion \ 3 ; RUN: -S < %s | FileCheck %s 4 5 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 6 target triple = "x86_64-unknown-linux-gnu" 7 8 @r = common global i32 0, align 4 9 @s = common global i32 0, align 4 10 11 ; CHECK-LABEL: define void @test1( 12 define void @test1(i1 %cmp, i32* noalias %p) { 13 entry: 14 br i1 %cmp, label %if.then, label %if.else 15 16 if.then: ; preds = %entry 17 call void @may_exit() nounwind 18 %arrayidx = getelementptr inbounds i32, i32* %p, i64 1 19 %0 = load i32, i32* %arrayidx, align 4 20 store i32 %0, i32* @r, align 4 21 br label %if.end 22 ; CHECK: call void @may_exit() 23 ; CHECK-NEXT: %[[gep:.*]] = getelementptr inbounds i32, i32* %p, i64 1 24 ; CHECK-NEXT: %[[load:.*]] = load i32, i32* %[[gep]], align 4 25 ; CHECK-NEXT: store i32 %[[load]], i32* @r, align 4 26 27 if.else: ; preds = %entry 28 %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 1 29 %1 = load i32, i32* %arrayidx1, align 4 30 store i32 %1, i32* @s, align 4 31 br label %if.end 32 33 if.end: ; preds = %if.else, %if.then 34 ret void 35 } 36 37 ; CHECK-LABEL: define void @test2( 38 define void @test2(i1 %cmp, i32* noalias %p) { 39 entry: 40 br i1 %cmp, label %if.then, label %if.else 41 42 if.then: ; preds = %entry 43 %arrayidx = getelementptr inbounds i32, i32* %p, i64 1 44 store i32 1, i32* %arrayidx, align 4 45 call void @may_throw() 46 ; CHECK: %[[gep:.*]] = getelementptr inbounds i32, i32* %p, i64 1 47 ; CHECK-NEXT: store i32 1, i32* %[[gep]], align 4 48 ; CHECK-NEXT: call void @may_throw() 49 br label %if.end 50 51 if.else: ; preds = %entry 52 %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 1 53 store i32 2, i32* %arrayidx1, align 4 54 br label %if.end 55 56 if.end: ; preds = %if.else, %if.then 57 ret void 58 } 59 60 declare void @may_throw() 61 declare void @may_exit() nounwind 62