1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -ipsccp -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; Don't constant-propagate byval pointers, since they are not pointers! 3*9880d681SAndroid Build Coastguard Worker; PR5038 4*9880d681SAndroid Build Coastguard Worker%struct.MYstr = type { i8, i32 } 5*9880d681SAndroid Build Coastguard Worker@mystr = internal global %struct.MYstr zeroinitializer ; <%struct.MYstr*> [#uses=3] 6*9880d681SAndroid Build Coastguard Workerdefine internal void @vfu1(%struct.MYstr* byval align 4 %u) nounwind { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker %0 = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 1 ; <i32*> [#uses=1] 9*9880d681SAndroid Build Coastguard Worker store i32 99, i32* %0, align 4 10*9880d681SAndroid Build Coastguard Worker; CHECK: %struct.MYstr* %u 11*9880d681SAndroid Build Coastguard Worker %1 = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 0 ; <i8*> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker store i8 97, i8* %1, align 4 13*9880d681SAndroid Build Coastguard Worker; CHECK: %struct.MYstr* %u 14*9880d681SAndroid Build Coastguard Worker br label %return 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 17*9880d681SAndroid Build Coastguard Worker ret void 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine internal i32 @vfu2(%struct.MYstr* byval align 4 %u) nounwind readonly { 21*9880d681SAndroid Build Coastguard Workerentry: 22*9880d681SAndroid Build Coastguard Worker %0 = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 1 ; <i32*> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %0 24*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* getelementptr inbounds (%struct.MYstr, %struct.MYstr* @mystr, i32 0, i32 1) 25*9880d681SAndroid Build Coastguard Worker %2 = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 0 ; <i8*> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8* %2 27*9880d681SAndroid Build Coastguard Worker; CHECK: load i8, i8* getelementptr inbounds (%struct.MYstr, %struct.MYstr* @mystr, i32 0, i32 0) 28*9880d681SAndroid Build Coastguard Worker %4 = zext i8 %3 to i32 29*9880d681SAndroid Build Coastguard Worker %5 = add i32 %4, %1 30*9880d681SAndroid Build Coastguard Worker ret i32 %5 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i32 @unions() nounwind { 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker call void @vfu1(%struct.MYstr* byval align 4 @mystr) nounwind 36*9880d681SAndroid Build Coastguard Worker %result = call i32 @vfu2(%struct.MYstr* byval align 4 @mystr) nounwind 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker ret i32 %result 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41