2009-09-24-byval-ptr.ll 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. ; RUN: opt < %s -ipsccp -S | 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, %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, %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. return: ; preds = %entry
  16. ret void
  17. }
  18. define internal i32 @vfu2(%struct.MYstr* byval align 4 %u) nounwind readonly {
  19. entry:
  20. %0 = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 1 ; <i32*> [#uses=1]
  21. %1 = load i32, i32* %0
  22. ; CHECK: load i32, i32* getelementptr inbounds (%struct.MYstr, %struct.MYstr* @mystr, i32 0, i32 1)
  23. %2 = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 0 ; <i8*> [#uses=1]
  24. %3 = load i8, i8* %2
  25. ; CHECK: load i8, i8* getelementptr inbounds (%struct.MYstr, %struct.MYstr* @mystr, i32 0, i32 0)
  26. %4 = zext i8 %3 to i32
  27. %5 = add i32 %4, %1
  28. ret i32 %5
  29. }
  30. define i32 @unions() nounwind {
  31. entry:
  32. call void @vfu1(%struct.MYstr* byval align 4 @mystr) nounwind
  33. %result = call i32 @vfu2(%struct.MYstr* byval align 4 @mystr) nounwind
  34. ret i32 %result
  35. }