92 lines · plain
1; RUN: opt -S -passes=mergefunc < %s | FileCheck %s2 3; These two functions are identical. The basic block labels are the same, and4; induce the same CFG. We are testing that block addresses within different5; functions are compared by their value, and not based on order. Both functions6; come from the same C-code, but in the first the two val_0/val_1 basic blocks7; are in a different order (they were manually switched post-compilation).8 9target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"10target triple = "x86_64-unknown-linux-gnu"11 12define i32 @_Z1fi(i32 %i) #0 {13entry:14 %i.addr = alloca i32, align 415 %ret = alloca i32, align 416 %l = alloca ptr, align 817 store i32 %i, ptr %i.addr, align 418 store i32 0, ptr %ret, align 419 store ptr blockaddress(@_Z1fi, %val_0), ptr %l, align 820 %0 = load i32, ptr %i.addr, align 421 %and = and i32 %0, 25622 %cmp = icmp eq i32 %and, 023 br i1 %cmp, label %if.then, label %if.end24 25if.then:26 store ptr blockaddress(@_Z1fi, %val_1), ptr %l, align 827 br label %if.end28 29if.end:30 %1 = load ptr, ptr %l, align 831 br label %indirectgoto32 33val_1:34 store i32 42, ptr %ret, align 435 br label %end36 37val_0:38 store i32 12, ptr %ret, align 439 br label %end40 41 42end:43 %2 = load i32, ptr %ret, align 444 ret i32 %245 46indirectgoto:47 %indirect.goto.dest = phi ptr [ %1, %if.end ]48 indirectbr ptr %indirect.goto.dest, [label %val_0, label %val_1]49}50 51define i32 @_Z1gi(i32 %i) #0 {52; CHECK-LABEL: define i32 @_Z1gi53; CHECK-NEXT: tail call i32 @_Z1fi54; CHECK-NEXT: ret55entry:56 %i.addr = alloca i32, align 457 %ret = alloca i32, align 458 %l = alloca ptr, align 859 store i32 %i, ptr %i.addr, align 460 store i32 0, ptr %ret, align 461 store ptr blockaddress(@_Z1gi, %val_0), ptr %l, align 862 %0 = load i32, ptr %i.addr, align 463 %and = and i32 %0, 25664 %cmp = icmp eq i32 %and, 065 br i1 %cmp, label %if.then, label %if.end66 67if.then:68 store ptr blockaddress(@_Z1gi, %val_1), ptr %l, align 869 br label %if.end70 71if.end:72 %1 = load ptr, ptr %l, align 873 br label %indirectgoto74 75val_0:76 store i32 12, ptr %ret, align 477 br label %end78 79val_1:80 store i32 42, ptr %ret, align 481 br label %end82 83end:84 %2 = load i32, ptr %ret, align 485 ret i32 %286 87indirectgoto:88 %indirect.goto.dest = phi ptr [ %1, %if.end ]89 indirectbr ptr %indirect.goto.dest, [label %val_0, label %val_1]90}91 92