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