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