113 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4define float @matching_scalar(ptr dereferenceable(16) %p) {5; CHECK-LABEL: @matching_scalar(6; CHECK-NEXT: [[R:%.*]] = load float, ptr [[P:%.*]], align 167; CHECK-NEXT: ret float [[R]]8;9 %r = load float, ptr %p, align 1610 ret float %r11}12 13define i32 @nonmatching_scalar(ptr dereferenceable(16) %p) {14; CHECK-LABEL: @nonmatching_scalar(15; CHECK-NEXT: [[R:%.*]] = load i32, ptr [[P:%.*]], align 1616; CHECK-NEXT: ret i32 [[R]]17;18 %r = load i32, ptr %p, align 1619 ret i32 %r20}21 22define i64 @larger_scalar(ptr dereferenceable(16) %p) {23; CHECK-LABEL: @larger_scalar(24; CHECK-NEXT: [[R:%.*]] = load i64, ptr [[P:%.*]], align 1625; CHECK-NEXT: ret i64 [[R]]26;27 %r = load i64, ptr %p, align 1628 ret i64 %r29}30 31define i8 @smaller_scalar(ptr dereferenceable(16) %p) {32; CHECK-LABEL: @smaller_scalar(33; CHECK-NEXT: [[R:%.*]] = load i8, ptr [[P:%.*]], align 1634; CHECK-NEXT: ret i8 [[R]]35;36 %r = load i8, ptr %p, align 1637 ret i8 %r38}39 40define i8 @smaller_scalar_less_aligned(ptr dereferenceable(16) %p) {41; CHECK-LABEL: @smaller_scalar_less_aligned(42; CHECK-NEXT: [[R:%.*]] = load i8, ptr [[P:%.*]], align 443; CHECK-NEXT: ret i8 [[R]]44;45 %r = load i8, ptr %p, align 446 ret i8 %r47}48 49define float @matching_scalar_small_deref(ptr dereferenceable(15) %p) {50; CHECK-LABEL: @matching_scalar_small_deref(51; CHECK-NEXT: [[R:%.*]] = load float, ptr [[P:%.*]], align 1652; CHECK-NEXT: ret float [[R]]53;54 %r = load float, ptr %p, align 1655 ret float %r56}57 58define float @matching_scalar_smallest_deref(ptr dereferenceable(1) %p) {59; CHECK-LABEL: @matching_scalar_smallest_deref(60; CHECK-NEXT: [[R:%.*]] = load float, ptr [[P:%.*]], align 1661; CHECK-NEXT: ret float [[R]]62;63 %r = load float, ptr %p, align 1664 ret float %r65}66 67define float @matching_scalar_smallest_deref_or_null(ptr dereferenceable_or_null(1) %p) {68; CHECK-LABEL: @matching_scalar_smallest_deref_or_null(69; CHECK-NEXT: [[R:%.*]] = load float, ptr [[P:%.*]], align 1670; CHECK-NEXT: ret float [[R]]71;72 %r = load float, ptr %p, align 1673 ret float %r74}75 76define float @matching_scalar_smallest_deref_addrspace(ptr addrspace(4) dereferenceable(1) %p) {77; CHECK-LABEL: @matching_scalar_smallest_deref_addrspace(78; CHECK-NEXT: [[R:%.*]] = load float, ptr addrspace(4) [[P:%.*]], align 1679; CHECK-NEXT: ret float [[R]]80;81 %r = load float, ptr addrspace(4) %p, align 1682 ret float %r83}84 85; A null pointer can't be assumed inbounds in a non-default address space.86 87define float @matching_scalar_smallest_deref_or_null_addrspace(ptr addrspace(4) dereferenceable_or_null(1) %p) {88; CHECK-LABEL: @matching_scalar_smallest_deref_or_null_addrspace(89; CHECK-NEXT: [[R:%.*]] = load float, ptr addrspace(4) [[P:%.*]], align 1690; CHECK-NEXT: ret float [[R]]91;92 %r = load float, ptr addrspace(4) %p, align 1693 ret float %r94}95 96define float @matching_scalar_volatile(ptr dereferenceable(16) %p) {97; CHECK-LABEL: @matching_scalar_volatile(98; CHECK-NEXT: [[R:%.*]] = load volatile float, ptr [[P:%.*]], align 1699; CHECK-NEXT: ret float [[R]]100;101 %r = load volatile float, ptr %p, align 16102 ret float %r103}104 105define float @nonvector(ptr dereferenceable(16) %p) {106; CHECK-LABEL: @nonvector(107; CHECK-NEXT: [[R:%.*]] = load float, ptr [[P:%.*]], align 16108; CHECK-NEXT: ret float [[R]]109;110 %r = load float, ptr %p, align 16111 ret float %r112}113