forked from OSchip/llvm-project
316 lines
11 KiB
LLVM
316 lines
11 KiB
LLVM
; 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 }
|