load-combine-assume.ll 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. ; RUN: opt -basicaa -load-combine -instcombine -S < %s | FileCheck %s
  2. target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
  3. target triple = "x86_64-unknown-linux-gnu"
  4. declare void @llvm.assume(i1) nounwind
  5. ; 'load' before the 'call' gets optimized:
  6. define i64 @test1(i32* nocapture readonly %a, i1 %b) {
  7. ; CHECK-LABEL: @test1
  8. ; CHECK-DAG: load i64, i64* %1, align 4
  9. ; CHECK-DAG: tail call void @llvm.assume(i1 %b)
  10. ; CHECK: ret i64
  11. %load1 = load i32, i32* %a, align 4
  12. %conv = zext i32 %load1 to i64
  13. %arrayidx1 = getelementptr inbounds i32, i32* %a, i64 1
  14. %load2 = load i32, i32* %arrayidx1, align 4
  15. tail call void @llvm.assume(i1 %b)
  16. %conv2 = zext i32 %load2 to i64
  17. %shl = shl nuw i64 %conv2, 32
  18. %add = or i64 %shl, %conv
  19. ret i64 %add
  20. }
  21. ; 'call' before the 'load' doesn't get optimized:
  22. define i64 @test2(i32* nocapture readonly %a, i1 %b) {
  23. ; CHECK-LABEL: @test2
  24. ; CHECK-DAG: load i64, i64* %1, align 4
  25. ; CHECK-DAG: tail call void @llvm.assume(i1 %b)
  26. ; CHECK: ret i64
  27. %load1 = load i32, i32* %a, align 4
  28. %conv = zext i32 %load1 to i64
  29. %arrayidx1 = getelementptr inbounds i32, i32* %a, i64 1
  30. tail call void @llvm.assume(i1 %b)
  31. %load2 = load i32, i32* %arrayidx1, align 4
  32. %conv2 = zext i32 %load2 to i64
  33. %shl = shl nuw i64 %conv2, 32
  34. %add = or i64 %shl, %conv
  35. ret i64 %add
  36. }