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