| ; 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 } |