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