1 ; RUN: opt -S -gvn-hoist < %s | FileCheck %s 2 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 3 target triple = "x86_64-unknown-linux-gnu" 4 5 define void @test1(i1 %b, i32* %x) { 6 entry: 7 br i1 %b, label %if.then, label %if.else 8 9 if.then: ; preds = %entry 10 store i32 2, i32* %x, align 4, !tbaa !1 11 br label %if.end 12 13 if.else: ; preds = %entry 14 store i32 2, i32* %x, align 4, !tbaa !5 15 br label %if.end 16 17 if.end: ; preds = %if.else, %if.then 18 ret void 19 } 20 ; CHECK-LABEL: define void @test1( 21 ; CHECK: store i32 2, i32* %x, align 4 22 ; CHECK-NEXT: br i1 %b 23 24 define void @test2(i1 %b, i32* %x) { 25 entry: 26 br i1 %b, label %if.then, label %if.else 27 28 if.then: ; preds = %entry 29 %gep1 = getelementptr inbounds i32, i32* %x, i64 1 30 store i32 2, i32* %gep1, align 4, !tbaa !1 31 br label %if.end 32 33 if.else: ; preds = %entry 34 %gep2 = getelementptr inbounds i32, i32* %x, i64 1 35 store i32 2, i32* %gep2, align 4, !tbaa !5 36 br label %if.end 37 38 if.end: ; preds = %if.else, %if.then 39 ret void 40 } 41 ; CHECK-LABEL: define void @test2( 42 ; CHECK: %[[gep:.*]] = getelementptr inbounds i32, i32* %x, i64 1 43 ; CHECK: store i32 2, i32* %[[gep]], align 4 44 ; CHECK-NEXT: br i1 %b 45 46 define void @test3(i1 %b, i32* %x) { 47 entry: 48 br i1 %b, label %if.then, label %if.else 49 50 if.then: ; preds = %entry 51 %gep1 = getelementptr inbounds i32, i32* %x, i64 1 52 store i32 2, i32* %gep1, align 4, !tbaa !1 53 br label %if.end 54 55 if.else: ; preds = %entry 56 %gep2 = getelementptr i32, i32* %x, i64 1 57 store i32 2, i32* %gep2, align 4, !tbaa !5 58 br label %if.end 59 60 if.end: ; preds = %if.else, %if.then 61 ret void 62 } 63 ; CHECK-LABEL: define void @test3( 64 ; CHECK: %[[gep:.*]] = getelementptr i32, i32* %x, i64 1 65 ; CHECK: store i32 2, i32* %[[gep]], align 4 66 ; CHECK-NEXT: br i1 %b 67 68 !1 = !{!2, !2, i64 0} 69 !2 = !{!"int", !3, i64 0} 70 !3 = !{!"omnipotent char", !4, i64 0} 71 !4 = !{!"Simple C++ TBAA"} 72 !5 = !{!6, !6, i64 0} 73 !6 = !{!"_ZTS1e", !3, i64 0} 74 75 define i32 @test4(i1 %b, i32* %y) { 76 entry: 77 br i1 %b, label %if.then, label %if.end 78 79 if.then: ; preds = %entry 80 %0 = load i32, i32* %y, align 4, !range !7 81 br label %return 82 83 if.end: ; preds = %entry 84 %1 = load i32, i32* %y, align 4, !range !8 85 br label %return 86 87 return: ; preds = %if.end, %if.then 88 %retval.0 = phi i32 [ %0, %if.then ], [ %1, %if.end ] 89 ret i32 %retval.0 90 } 91 ; CHECK-LABEL: define i32 @test4( 92 ; CHECK: %[[load:.*]] = load i32, i32* %y, align 4, !range ![[range_md:.*]] 93 ; CHECK: %[[phi:.*]] = phi i32 [ %[[load]], %{{.*}} ], [ %[[load]], %{{.*}} ] 94 ; CHECK: ret i32 %[[phi]] 95 96 !7 = !{i32 0, i32 2} 97 !8 = !{i32 3, i32 4} 98 ; CHECK: ![[range_md]] = !{i32 0, i32 2, i32 3, i32 4} 99