xref: /llvm-project/llvm/test/Transforms/InstCombine/vscale.ll (revision da4a5a46b3c86df436d37f81c0b7849f93d7fbde)
1*da4a5a46SSander de Smalen; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*da4a5a46SSander de Smalen; RUN: opt -passes='instcombine' -S < %s | FileCheck %s
3*da4a5a46SSander de Smalentarget datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
4*da4a5a46SSander de Smalen
5*da4a5a46SSander de Smalendefine i64 @promote_vscale_i32_to_i64() {
6*da4a5a46SSander de Smalen; CHECK-LABEL: @promote_vscale_i32_to_i64(
7*da4a5a46SSander de Smalen; CHECK-NEXT:    [[VSCALE:%.*]] = call i64 @llvm.vscale.i64()
8*da4a5a46SSander de Smalen; CHECK-NEXT:    [[EXT:%.*]] = and i64 [[VSCALE]], 4294967295
9*da4a5a46SSander de Smalen; CHECK-NEXT:    ret i64 [[EXT]]
10*da4a5a46SSander de Smalen;
11*da4a5a46SSander de Smalen  %vscale = call i32 @llvm.vscale.i32()
12*da4a5a46SSander de Smalen  %ext = zext i32 %vscale to i64
13*da4a5a46SSander de Smalen  ret i64 %ext
14*da4a5a46SSander de Smalen}
15*da4a5a46SSander de Smalen
16*da4a5a46SSander de Smalendefine i64 @pomote_zext_shl_vscale_i32_to_i64() {
17*da4a5a46SSander de Smalen; CHECK-LABEL: @pomote_zext_shl_vscale_i32_to_i64(
18*da4a5a46SSander de Smalen; CHECK-NEXT:    [[VSCALE:%.*]] = call i64 @llvm.vscale.i64()
19*da4a5a46SSander de Smalen; CHECK-NEXT:    [[SHL:%.*]] = shl i64 [[VSCALE]], 3
20*da4a5a46SSander de Smalen; CHECK-NEXT:    [[EXT:%.*]] = and i64 [[SHL]], 4294967288
21*da4a5a46SSander de Smalen; CHECK-NEXT:    ret i64 [[EXT]]
22*da4a5a46SSander de Smalen;
23*da4a5a46SSander de Smalen  %vscale = call i32 @llvm.vscale.i32()
24*da4a5a46SSander de Smalen  %shl = shl i32 %vscale, 3
25*da4a5a46SSander de Smalen  %ext = zext i32 %shl to i64
26*da4a5a46SSander de Smalen  ret i64 %ext
27*da4a5a46SSander de Smalen}
28*da4a5a46SSander de Smalen
29*da4a5a46SSander de Smalen; Same test as @pomote_zext_shl_vscale_i32_to_i64, but with the
30*da4a5a46SSander de Smalen; vscale_range attribute so that the 'and' is folded away.
31*da4a5a46SSander de Smalendefine i64 @free_zext_vscale_shl_i32_to_i64() #0 {
32*da4a5a46SSander de Smalen; CHECK-LABEL: @free_zext_vscale_shl_i32_to_i64(
33*da4a5a46SSander de Smalen; CHECK-NEXT:    [[VSCALE:%.*]] = call i64 @llvm.vscale.i64()
34*da4a5a46SSander de Smalen; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i64 [[VSCALE]], 3
35*da4a5a46SSander de Smalen; CHECK-NEXT:    ret i64 [[SHL]]
36*da4a5a46SSander de Smalen;
37*da4a5a46SSander de Smalen  %vscale = call i32 @llvm.vscale.i32()
38*da4a5a46SSander de Smalen  %shl = shl i32 %vscale, 3
39*da4a5a46SSander de Smalen  %ext = zext i32 %shl to i64
40*da4a5a46SSander de Smalen  ret i64 %ext
41*da4a5a46SSander de Smalen}
42*da4a5a46SSander de Smalen
43*da4a5a46SSander de Smalendeclare i32 @llvm.vscale.i32()
44*da4a5a46SSander de Smalen
45*da4a5a46SSander de Smalenattributes #0 = { vscale_range(1,16) }
46