83 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes=mergeicmps -verify-dom-info | FileCheck %s3target triple = "x86_64"4 5; First check that we try to from a memcmp.6define void @form_memcmp(ptr dereferenceable(16) %a, ptr dereferenceable(16) %b) {7; CHECK-LABEL: @form_memcmp(8; CHECK-NEXT: bb0:9; CHECK-NEXT: [[PTR_A1:%.*]] = getelementptr inbounds [2 x i64], ptr [[A:%.*]], i64 0, i64 110; CHECK-NEXT: [[PTR_B1:%.*]] = getelementptr inbounds [2 x i64], ptr [[B:%.*]], i64 0, i64 111; CHECK-NEXT: br label %"bb1+bb2"12; CHECK: "bb1+bb2":13; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr [[A]], ptr [[B]], i64 16)14; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[MEMCMP]], 015; CHECK-NEXT: br label [[BB3:%.*]]16; CHECK: bb3:17; CHECK-NEXT: ret void18;19bb0:20 %ptr_a1 = getelementptr inbounds [2 x i64], ptr %a, i64 0, i64 121 %ptr_b1 = getelementptr inbounds [2 x i64], ptr %b, i64 0, i64 122 br label %bb123 24bb1: ; preds = %bb025 %a0 = load i64, ptr %a26 %b0 = load i64, ptr %b27 %cond0 = icmp eq i64 %a0, %b028 br i1 %cond0, label %bb2, label %bb329 30bb2: ; preds = %bb131 %a1 = load i64, ptr %ptr_a132 %b1 = load i64, ptr %ptr_b133 %cond1 = icmp eq i64 %a1, %b134 br label %bb335 36bb3: ; preds = %bb2, %bb137 %necessary = phi i1 [ %cond1, %bb2 ], [ false, %bb1 ]38 ret void39}40 41; We can't use memcmp between arbitrary addressesspaces42define void @no_memcmp(ptr addrspace(11) dereferenceable(16) %a, ptr addrspace(11) dereferenceable(16) %b) {43; CHECK-LABEL: @no_memcmp(44; CHECK-NEXT: bb0:45; CHECK-NEXT: [[PTR_A1:%.*]] = getelementptr inbounds [2 x i64], ptr addrspace(11) [[A:%.*]], i64 0, i64 146; CHECK-NEXT: [[PTR_B1:%.*]] = getelementptr inbounds [2 x i64], ptr addrspace(11) [[B:%.*]], i64 0, i64 147; CHECK-NEXT: br label [[BB1:%.*]]48; CHECK: bb1:49; CHECK-NEXT: [[A0:%.*]] = load i64, ptr addrspace(11) [[A]], align 850; CHECK-NEXT: [[B0:%.*]] = load i64, ptr addrspace(11) [[B]], align 851; CHECK-NEXT: [[COND0:%.*]] = icmp eq i64 [[A0]], [[B0]]52; CHECK-NEXT: br i1 [[COND0]], label [[BB2:%.*]], label [[BB3:%.*]]53; CHECK: bb2:54; CHECK-NEXT: [[A1:%.*]] = load i64, ptr addrspace(11) [[PTR_A1]], align 855; CHECK-NEXT: [[B1:%.*]] = load i64, ptr addrspace(11) [[PTR_B1]], align 856; CHECK-NEXT: [[COND1:%.*]] = icmp eq i64 [[A1]], [[B1]]57; CHECK-NEXT: br label [[BB3]]58; CHECK: bb3:59; CHECK-NEXT: [[NECESSARY:%.*]] = phi i1 [ [[COND1]], [[BB2]] ], [ false, [[BB1]] ]60; CHECK-NEXT: ret void61;62bb0:63 %ptr_a1 = getelementptr inbounds [2 x i64], ptr addrspace(11) %a, i64 0, i64 164 %ptr_b1 = getelementptr inbounds [2 x i64], ptr addrspace(11) %b, i64 0, i64 165 br label %bb166 67bb1: ; preds = %bb068 %a0 = load i64, ptr addrspace(11) %a69 %b0 = load i64, ptr addrspace(11) %b70 %cond0 = icmp eq i64 %a0, %b071 br i1 %cond0, label %bb2, label %bb372 73bb2: ; preds = %bb174 %a1 = load i64, ptr addrspace(11) %ptr_a175 %b1 = load i64, ptr addrspace(11) %ptr_b176 %cond1 = icmp eq i64 %a1, %b177 br label %bb378 79bb3: ; preds = %bb2, %bb180 %necessary = phi i1 [ %cond1, %bb2 ], [ false, %bb1 ]81 ret void82}83