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