
Functions using different constant expressions were incorrectly merged, because a lot of state was missing from the comparison, including the opcode, the comparison predicate, the GEP element type, as well as the inbounds, inrange and nowrap poison flags.
87 lines
2.5 KiB
LLVM
87 lines
2.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 4
|
|
; RUN: opt -S -passes=mergefunc -mergefunc-use-aliases < %s | FileCheck %s
|
|
|
|
@g1 = external unnamed_addr global i8
|
|
@g2 = external unnamed_addr global i8
|
|
|
|
;.
|
|
; CHECK: @g1 = external unnamed_addr global i8
|
|
; CHECK: @g2 = external unnamed_addr global i8
|
|
;.
|
|
define i1 @f1() unnamed_addr {
|
|
; CHECK-LABEL: define i1 @f1() unnamed_addr {
|
|
; CHECK-NEXT: ret i1 icmp eq (ptr @g1, ptr @g2)
|
|
;
|
|
ret i1 icmp eq (ptr @g1, ptr @g2)
|
|
}
|
|
|
|
define i1 @f2() unnamed_addr {
|
|
; CHECK-LABEL: define i1 @f2() unnamed_addr {
|
|
; CHECK-NEXT: ret i1 icmp ne (ptr @g1, ptr @g2)
|
|
;
|
|
ret i1 icmp ne (ptr @g1, ptr @g2)
|
|
}
|
|
|
|
define ptr @f3() unnamed_addr {
|
|
; CHECK-LABEL: define ptr @f3() unnamed_addr {
|
|
; CHECK-NEXT: ret ptr getelementptr inbounds (i8, ptr @g1, i64 2)
|
|
;
|
|
ret ptr getelementptr inbounds (i8, ptr @g1, i64 2)
|
|
}
|
|
|
|
define ptr @f4() unnamed_addr {
|
|
; CHECK-LABEL: define ptr @f4() unnamed_addr {
|
|
; CHECK-NEXT: ret ptr getelementptr (i16, ptr @g1, i64 2)
|
|
;
|
|
ret ptr getelementptr (i16, ptr @g1, i64 2)
|
|
}
|
|
|
|
define ptr @f5() unnamed_addr {
|
|
; CHECK-LABEL: define ptr @f5() unnamed_addr {
|
|
; CHECK-NEXT: ret ptr getelementptr (i8, ptr @g1, i64 2)
|
|
;
|
|
ret ptr getelementptr (i8, ptr @g1, i64 2)
|
|
}
|
|
|
|
define i64 @f6() unnamed_addr {
|
|
; CHECK-LABEL: define i64 @f6() unnamed_addr {
|
|
; CHECK-NEXT: ret i64 add nuw (i64 ptrtoint (ptr @g1 to i64), i64 1)
|
|
;
|
|
ret i64 add nuw (i64 ptrtoint (ptr @g1 to i64), i64 1)
|
|
}
|
|
|
|
define i64 @f7() unnamed_addr {
|
|
; CHECK-LABEL: define i64 @f7() unnamed_addr {
|
|
; CHECK-NEXT: ret i64 add (i64 ptrtoint (ptr @g1 to i64), i64 1)
|
|
;
|
|
ret i64 add (i64 ptrtoint (ptr @g1 to i64), i64 1)
|
|
}
|
|
|
|
define i64 @f8() unnamed_addr {
|
|
; CHECK-LABEL: define i64 @f8() unnamed_addr {
|
|
; CHECK-NEXT: ret i64 sub (i64 ptrtoint (ptr @g1 to i64), i64 1)
|
|
;
|
|
ret i64 sub (i64 ptrtoint (ptr @g1 to i64), i64 1)
|
|
}
|
|
|
|
define ptr @f10() unnamed_addr {
|
|
; CHECK-LABEL: define ptr @f10() unnamed_addr {
|
|
; CHECK-NEXT: ret ptr getelementptr ([4 x i32], ptr @g1, i64 0, inrange i64 1)
|
|
;
|
|
ret ptr getelementptr ([4 x i32], ptr @g1, i64 0, inrange i64 1)
|
|
}
|
|
|
|
define ptr @f11() unnamed_addr {
|
|
; CHECK-LABEL: define ptr @f11() unnamed_addr {
|
|
; CHECK-NEXT: ret ptr getelementptr ([4 x i32], ptr @g1, i64 0, i64 1)
|
|
;
|
|
ret ptr getelementptr ([4 x i32], ptr @g1, i64 0, i64 1)
|
|
}
|
|
|
|
define ptr @f12() unnamed_addr {
|
|
; CHECK-LABEL: define ptr @f12() unnamed_addr {
|
|
; CHECK-NEXT: ret ptr getelementptr ([4 x i32], ptr @g1, inrange i64 0, i64 1)
|
|
;
|
|
ret ptr getelementptr ([4 x i32], ptr @g1, inrange i64 0, i64 1)
|
|
}
|