; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@g1 = global i32 0, align 4
@g2 = internal global i32 0, align 4
@g3 = unnamed_addr global i32 0, align 4
@g4 = hidden global i32 0, align 4
@g5 = protected global i32 0, align 4
@g6 = thread_local unnamed_addr global i32 0, align 4
; Make sure we can simplify away a pointer comparison between
; dynamically-allocated memory and a local stack allocation.
; void p()
; {
; int *mData;
; int mStackData[10];
; mData = new int[12];
; if (mData != mStackData) {
; delete[] mData;
; }
; }
define void @_Z2p1v() {
; CHECK-LABEL: @_Z2p1v(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[I1:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2:[0-9]+]]
; CHECK-NEXT: br i1 false, label [[BB6:%.*]], label [[BB5:%.*]]
; CHECK: bb5:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I1]]) #[[ATTR3:[0-9]+]]
; CHECK-NEXT: br label [[BB6]]
; CHECK: bb6:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], align 16
%i1 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = icmp eq ptr %i1, %mStackData
br i1 %i4, label %bb6, label %bb5
bb5: ; preds = %bb
call void @_ZdaPv(ptr %i1) #4
br label %bb6
bb6: ; preds = %bb5, %bb
ret void
}
define void @_Z2p2bb(i1 zeroext %b1, i1 zeroext %b2) {
; CHECK-LABEL: @_Z2p2bb(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: br i1 false, label [[BB8:%.*]], label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]]
; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]]
; CHECK-NEXT: br label [[BB8]]
; CHECK: bb8:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], align 16
%i2 = select i1 %b1, ptr %mStackData, ptr @g2
%i3 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = tail call noalias ptr @_Znam(i64 48) #3
%.v = select i1 %b2, ptr %i3, ptr %i4
%i6 = icmp eq ptr %.v, %i2
br i1 %i6, label %bb8, label %bb7
bb7: ; preds = %bb
call void @_ZdaPv(ptr %i3) #4
call void @_ZdaPv(ptr %i4) #4
br label %bb8
bb8: ; preds = %bb7, %bb
ret void
}
define void @_Z2p4bb(i1 zeroext %b1, i1 zeroext %b2) {
; CHECK-LABEL: @_Z2p4bb(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: br i1 false, label [[BB8:%.*]], label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]]
; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]]
; CHECK-NEXT: br label [[BB8]]
; CHECK: bb8:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], align 16
%i2 = select i1 %b1, ptr %mStackData, ptr @g3
%i3 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = tail call noalias ptr @_Znam(i64 48) #3
%.v = select i1 %b2, ptr %i3, ptr %i4
%i6 = icmp eq ptr %.v, %i2
br i1 %i6, label %bb8, label %bb7
bb7: ; preds = %bb
call void @_ZdaPv(ptr %i3) #4
call void @_ZdaPv(ptr %i4) #4
br label %bb8
bb8: ; preds = %bb7, %bb
ret void
}
define void @_Z2p5bb(i1 zeroext %b1, i1 zeroext %b2) {
; CHECK-LABEL: @_Z2p5bb(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: br i1 false, label [[BB8:%.*]], label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]]
; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]]
; CHECK-NEXT: br label [[BB8]]
; CHECK: bb8:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], align 16
%i2 = select i1 %b1, ptr %mStackData, ptr @g4
%i3 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = tail call noalias ptr @_Znam(i64 48) #3
%.v = select i1 %b2, ptr %i3, ptr %i4
%i6 = icmp eq ptr %.v, %i2
br i1 %i6, label %bb8, label %bb7
bb7: ; preds = %bb
call void @_ZdaPv(ptr %i3) #4
call void @_ZdaPv(ptr %i4) #4
br label %bb8
bb8: ; preds = %bb7, %bb
ret void
}
define void @_Z2p6bb(i1 zeroext %b1, i1 zeroext %b2) {
; CHECK-LABEL: @_Z2p6bb(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: br i1 false, label [[BB8:%.*]], label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]]
; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]]
; CHECK-NEXT: br label [[BB8]]
; CHECK: bb8:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], align 16
%i2 = select i1 %b1, ptr %mStackData, ptr @g5
%i3 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = tail call noalias ptr @_Znam(i64 48) #3
%.v = select i1 %b2, ptr %i3, ptr %i4
%i6 = icmp eq ptr %.v, %i2
br i1 %i6, label %bb8, label %bb7
bb7: ; preds = %bb
call void @_ZdaPv(ptr %i3) #4
call void @_ZdaPv(ptr %i4) #4
br label %bb8
bb8: ; preds = %bb7, %bb
ret void
}
define void @_Z4nopebbPi(i1 zeroext %b1, i1 zeroext %b2, ptr readnone %q) {
; CHECK-LABEL: @_Z4nopebbPi(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16
; CHECK-NEXT: [[I2:%.*]] = select i1 [[B1:%.*]], ptr [[MSTACKDATA]], ptr [[Q:%.*]]
; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], ptr [[I3]], ptr [[I4]]
; CHECK-NEXT: [[I6:%.*]] = icmp eq ptr [[DOTV]], [[I2]]
; CHECK-NEXT: br i1 [[I6]], label [[BB8:%.*]], label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]]
; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]]
; CHECK-NEXT: br label [[BB8]]
; CHECK: bb8:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], align 16
%i2 = select i1 %b1, ptr %mStackData, ptr %q
%i3 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = tail call noalias ptr @_Znam(i64 48) #3
%.v = select i1 %b2, ptr %i3, ptr %i4
%i6 = icmp eq ptr %.v, %i2
br i1 %i6, label %bb8, label %bb7
bb7: ; preds = %bb
call void @_ZdaPv(ptr %i3) #4
call void @_ZdaPv(ptr %i4) #4
br label %bb8
bb8: ; preds = %bb7, %bb
ret void
}
define void @_Z2p3bb(i1 zeroext %b1, i1 zeroext %b2) {
; CHECK-LABEL: @_Z2p3bb(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16
; CHECK-NEXT: [[I2:%.*]] = select i1 [[B1:%.*]], ptr [[MSTACKDATA]], ptr @g1
; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], ptr [[I3]], ptr [[I4]]
; CHECK-NEXT: [[I6:%.*]] = icmp eq ptr [[DOTV]], [[I2]]
; CHECK-NEXT: br i1 [[I6]], label [[BB8:%.*]], label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]]
; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]]
; CHECK-NEXT: br label [[BB8]]
; CHECK: bb8:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], align 16
%i2 = select i1 %b1, ptr %mStackData, ptr @g1
%i3 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = tail call noalias ptr @_Znam(i64 48) #3
%.v = select i1 %b2, ptr %i3, ptr %i4
%i6 = icmp eq ptr %.v, %i2
br i1 %i6, label %bb8, label %bb7
bb7: ; preds = %bb
call void @_ZdaPv(ptr %i3) #4
call void @_ZdaPv(ptr %i4) #4
br label %bb8
bb8: ; preds = %bb7, %bb
ret void
}
define void @_Z2p7bb(i1 zeroext %b1, i1 zeroext %b2) {
; CHECK-LABEL: @_Z2p7bb(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16
; CHECK-NEXT: [[I2:%.*]] = select i1 [[B1:%.*]], ptr [[MSTACKDATA]], ptr @g6
; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], ptr [[I3]], ptr [[I4]]
; CHECK-NEXT: [[I6:%.*]] = icmp eq ptr [[DOTV]], [[I2]]
; CHECK-NEXT: br i1 [[I6]], label [[BB8:%.*]], label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]]
; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]]
; CHECK-NEXT: br label [[BB8]]
; CHECK: bb8:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], align 16
%i2 = select i1 %b1, ptr %mStackData, ptr @g6
%i3 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = tail call noalias ptr @_Znam(i64 48) #3
%.v = select i1 %b2, ptr %i3, ptr %i4
%i6 = icmp eq ptr %.v, %i2
br i1 %i6, label %bb8, label %bb7
bb7: ; preds = %bb
call void @_ZdaPv(ptr %i3) #4
call void @_ZdaPv(ptr %i4) #4
br label %bb8
bb8: ; preds = %bb7, %bb
ret void
}
define void @_Z2p2v(i32 %c) {
; CHECK-LABEL: @_Z2p2v(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], i32 [[C:%.*]], align 16
; CHECK-NEXT: [[I1:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]]
; CHECK-NEXT: [[I4:%.*]] = icmp eq ptr [[I1]], [[MSTACKDATA]]
; CHECK-NEXT: br i1 [[I4]], label [[BB6:%.*]], label [[BB5:%.*]]
; CHECK: bb5:
; CHECK-NEXT: call void @_ZdaPv(ptr [[I1]]) #[[ATTR3]]
; CHECK-NEXT: br label [[BB6]]
; CHECK: bb6:
; CHECK-NEXT: ret void
;
bb:
%mStackData = alloca [10 x i32], i32 %c, align 16
%i1 = tail call noalias ptr @_Znam(i64 48) #3
%i4 = icmp eq ptr %i1, %mStackData
br i1 %i4, label %bb6, label %bb5
bb5: ; preds = %bb
call void @_ZdaPv(ptr %i1) #4
br label %bb6
bb6: ; preds = %bb5, %bb
ret void
}
; Function Attrs: nobuiltin
declare noalias ptr @_Znam(i64) #1
; Function Attrs: nobuiltin nounwind
declare void @_ZdaPv(ptr) #2
attributes #1 = { nobuiltin }
attributes #2 = { nobuiltin nounwind }
attributes #3 = { builtin }
attributes #4 = { builtin nounwind }