xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/div-shift.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine i32 @t1(i16 zeroext %x, i32 %y) {
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t1(
6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CONV:%.*]] = zext i16 %x to i32
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP0:%.*]] = add i32 %y, 1
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = lshr i32 [[CONV]], [[TMP0]]
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[D]]
11*9880d681SAndroid Build Coastguard Worker;
12*9880d681SAndroid Build Coastguard Workerentry:
13*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %x to i32
14*9880d681SAndroid Build Coastguard Worker  %s = shl i32 2, %y
15*9880d681SAndroid Build Coastguard Worker  %d = sdiv i32 %conv, %s
16*9880d681SAndroid Build Coastguard Worker  ret i32 %d
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; rdar://11721329
20*9880d681SAndroid Build Coastguard Workerdefine i64 @t2(i64 %x, i32 %y) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t2(
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = zext i32 %y to i64
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = lshr i64 %x, [[TMP1]]
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[TMP2]]
25*9880d681SAndroid Build Coastguard Worker;
26*9880d681SAndroid Build Coastguard Worker  %1 = shl i32 1, %y
27*9880d681SAndroid Build Coastguard Worker  %2 = zext i32 %1 to i64
28*9880d681SAndroid Build Coastguard Worker  %3 = udiv i64 %x, %2
29*9880d681SAndroid Build Coastguard Worker  ret i64 %3
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; PR13250
33*9880d681SAndroid Build Coastguard Workerdefine i64 @t3(i64 %x, i32 %y) {
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t3(
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = add i32 %y, 2
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = lshr i64 %x, [[TMP2]]
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[TMP3]]
39*9880d681SAndroid Build Coastguard Worker;
40*9880d681SAndroid Build Coastguard Worker  %1 = shl i32 4, %y
41*9880d681SAndroid Build Coastguard Worker  %2 = zext i32 %1 to i64
42*9880d681SAndroid Build Coastguard Worker  %3 = udiv i64 %x, %2
43*9880d681SAndroid Build Coastguard Worker  ret i64 %3
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine i32 @t4(i32 %x, i32 %y) {
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t4(
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 %y, 5
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DOTV:%.*]] = select i1 [[TMP1]], i32 5, i32 %y
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 %x, [[DOTV]]
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP2]]
52*9880d681SAndroid Build Coastguard Worker;
53*9880d681SAndroid Build Coastguard Worker  %1 = shl i32 1, %y
54*9880d681SAndroid Build Coastguard Worker  %2 = icmp ult i32 %1, 32
55*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %2, i32 32, i32 %1
56*9880d681SAndroid Build Coastguard Worker  %4 = udiv i32 %x, %3
57*9880d681SAndroid Build Coastguard Worker  ret i32 %4
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdefine i32 @t5(i1 %x, i1 %y, i32 %V) {
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t5(
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DOTV:%.*]] = select i1 %x, i32 5, i32 6
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = lshr i32 %V, [[DOTV]]
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = select i1 %y, i32 [[TMP1]], i32 0
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP2]]
66*9880d681SAndroid Build Coastguard Worker;
67*9880d681SAndroid Build Coastguard Worker  %1 = shl i32 1, %V
68*9880d681SAndroid Build Coastguard Worker  %2 = select i1 %x, i32 32, i32 64
69*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %y, i32 %2, i32 %1
70*9880d681SAndroid Build Coastguard Worker  %4 = udiv i32 %V, %3
71*9880d681SAndroid Build Coastguard Worker  ret i32 %4
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine i32 @t6(i32 %x, i32 %z) {
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t6(
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = icmp eq i32 %x, 0
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DIVISOR:%.*]] = select i1 [[X_IS_ZERO]], i32 1, i32 %x
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = udiv i32 %z, [[DIVISOR]]
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Y]]
80*9880d681SAndroid Build Coastguard Worker;
81*9880d681SAndroid Build Coastguard Worker  %x_is_zero = icmp eq i32 %x, 0
82*9880d681SAndroid Build Coastguard Worker  %divisor = select i1 %x_is_zero, i32 1, i32 %x
83*9880d681SAndroid Build Coastguard Worker  %y = udiv i32 %z, %divisor
84*9880d681SAndroid Build Coastguard Worker  ret i32 %y
85*9880d681SAndroid Build Coastguard Worker}
86