1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2 2; RUN: opt -S -passes=gvn-hoist < %s | FileCheck %s 3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4target triple = "x86_64-unknown-linux-gnu" 5 6define void @test1(i1 %b, ptr %x) { 7; CHECK-LABEL: define void @test1 8; CHECK-SAME: (i1 [[B:%.*]], ptr [[X:%.*]]) { 9; CHECK-NEXT: entry: 10; CHECK-NEXT: store i32 2, ptr [[X]], align 4, !tbaa [[TBAA0:![0-9]+]] 11; CHECK-NEXT: br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 12; CHECK: if.then: 13; CHECK-NEXT: br label [[IF_END:%.*]] 14; CHECK: if.else: 15; CHECK-NEXT: br label [[IF_END]] 16; CHECK: if.end: 17; CHECK-NEXT: ret void 18; 19entry: 20 br i1 %b, label %if.then, label %if.else 21 22if.then: ; preds = %entry 23 store i32 2, ptr %x, align 4, !tbaa !1 24 br label %if.end 25 26if.else: ; preds = %entry 27 store i32 2, ptr %x, align 4, !tbaa !5 28 br label %if.end 29 30if.end: ; preds = %if.else, %if.then 31 ret void 32} 33 34define void @test2(i1 %b, ptr %x) { 35; CHECK-LABEL: define void @test2 36; CHECK-SAME: (i1 [[B:%.*]], ptr [[X:%.*]]) { 37; CHECK-NEXT: entry: 38; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1 39; CHECK-NEXT: store i32 2, ptr [[TMP0]], align 4, !tbaa [[TBAA0]] 40; CHECK-NEXT: br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 41; CHECK: if.then: 42; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1 43; CHECK-NEXT: br label [[IF_END:%.*]] 44; CHECK: if.else: 45; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1 46; CHECK-NEXT: br label [[IF_END]] 47; CHECK: if.end: 48; CHECK-NEXT: ret void 49; 50entry: 51 br i1 %b, label %if.then, label %if.else 52 53if.then: ; preds = %entry 54 %gep1 = getelementptr inbounds i32, ptr %x, i64 1 55 store i32 2, ptr %gep1, align 4, !tbaa !1 56 br label %if.end 57 58if.else: ; preds = %entry 59 %gep2 = getelementptr inbounds i32, ptr %x, i64 1 60 store i32 2, ptr %gep2, align 4, !tbaa !5 61 br label %if.end 62 63if.end: ; preds = %if.else, %if.then 64 ret void 65} 66 67define void @test3(i1 %b, ptr %x) { 68; CHECK-LABEL: define void @test3 69; CHECK-SAME: (i1 [[B:%.*]], ptr [[X:%.*]]) { 70; CHECK-NEXT: entry: 71; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[X]], i64 1 72; CHECK-NEXT: store i32 2, ptr [[TMP0]], align 4, !tbaa [[TBAA0]] 73; CHECK-NEXT: br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 74; CHECK: if.then: 75; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1 76; CHECK-NEXT: br label [[IF_END:%.*]] 77; CHECK: if.else: 78; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[X]], i64 1 79; CHECK-NEXT: br label [[IF_END]] 80; CHECK: if.end: 81; CHECK-NEXT: ret void 82; 83entry: 84 br i1 %b, label %if.then, label %if.else 85 86if.then: ; preds = %entry 87 %gep1 = getelementptr inbounds i32, ptr %x, i64 1 88 store i32 2, ptr %gep1, align 4, !tbaa !1 89 br label %if.end 90 91if.else: ; preds = %entry 92 %gep2 = getelementptr i32, ptr %x, i64 1 93 store i32 2, ptr %gep2, align 4, !tbaa !5 94 br label %if.end 95 96if.end: ; preds = %if.else, %if.then 97 ret void 98} 99 100define i32 @test4(i1 %b, ptr %y) { 101; CHECK-LABEL: define i32 @test4 102; CHECK-SAME: (i1 [[B:%.*]], ptr [[Y:%.*]]) { 103; CHECK-NEXT: entry: 104; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[Y]], align 4, !range [[RNG3:![0-9]+]] 105; CHECK-NEXT: br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 106; CHECK: if.then: 107; CHECK-NEXT: br label [[RETURN:%.*]] 108; CHECK: if.end: 109; CHECK-NEXT: br label [[RETURN]] 110; CHECK: return: 111; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[TMP0]], [[IF_THEN]] ], [ [[TMP0]], [[IF_END]] ] 112; CHECK-NEXT: ret i32 [[RETVAL_0]] 113; 114entry: 115 br i1 %b, label %if.then, label %if.end 116 117if.then: ; preds = %entry 118 %0 = load i32, ptr %y, align 4, !range !7 119 br label %return 120 121if.end: ; preds = %entry 122 %1 = load i32, ptr %y, align 4, !range !8 123 br label %return 124 125return: ; preds = %if.end, %if.then 126 %retval.0 = phi i32 [ %0, %if.then ], [ %1, %if.end ] 127 ret i32 %retval.0 128} 129 130define ptr @test5(i1 %b, ptr %y) { 131; CHECK-LABEL: define ptr @test5 132; CHECK-SAME: (i1 [[B:%.*]], ptr [[Y:%.*]]) { 133; CHECK-NEXT: entry: 134; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[Y]], align 4 135; CHECK-NEXT: br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 136; CHECK: if.then: 137; CHECK-NEXT: br label [[RETURN:%.*]] 138; CHECK: if.end: 139; CHECK-NEXT: br label [[RETURN]] 140; CHECK: return: 141; CHECK-NEXT: [[RETVAL_0:%.*]] = phi ptr [ [[TMP0]], [[IF_THEN]] ], [ [[TMP0]], [[IF_END]] ] 142; CHECK-NEXT: ret ptr [[RETVAL_0]] 143; 144entry: 145 br i1 %b, label %if.then, label %if.end 146 147if.then: ; preds = %entry 148 %0 = load ptr, ptr %y, align 4, !nonnull !9 149 br label %return 150 151if.end: ; preds = %entry 152 %1 = load ptr, ptr %y, align 4 153 br label %return 154 155return: ; preds = %if.end, %if.then 156 %retval.0 = phi ptr [ %0, %if.then ], [ %1, %if.end ] 157 ret ptr %retval.0 158} 159 160!1 = !{!2, !2, i64 0} 161!2 = !{!"int", !3, i64 0} 162!3 = !{!"omnipotent char", !4, i64 0} 163!4 = !{!"Simple C++ TBAA"} 164!5 = !{!6, !6, i64 0} 165!6 = !{!"_ZTS1e", !3, i64 0} 166!7 = !{i32 0, i32 2} 167!8 = !{i32 3, i32 4} 168!9 = !{} 169;. 170; CHECK: [[TBAA0]] = !{!1, !1, i64 0} 171; CHECK: [[META1:![0-9]+]] = !{!"omnipotent char", !2, i64 0} 172; CHECK: [[META2:![0-9]+]] = !{!"Simple C++ TBAA"} 173; CHECK: [[RNG3]] = !{i32 0, i32 2, i32 3, i32 4} 174;. 175