xref: /llvm-project/llvm/test/Transforms/InstCombine/ptr-int-cast.ll (revision 56b3222b79632a4bbb36271735556a03b2504791)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
4
5define i1 @test1(ptr %x) nounwind {
6; CHECK-LABEL: @test1(
7; CHECK-NEXT:  entry:
8; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[X:%.*]] to i64
9; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP0]] to i1
10; CHECK-NEXT:    ret i1 [[TMP2]]
11;
12entry:
13  %0 = ptrtoint ptr %x to i1
14  ret i1 %0
15}
16
17define ptr @test2(i128 %x) nounwind {
18; CHECK-LABEL: @test2(
19; CHECK-NEXT:  entry:
20; CHECK-NEXT:    [[TMP0:%.*]] = trunc i128 [[X:%.*]] to i64
21; CHECK-NEXT:    [[TMP1:%.*]] = inttoptr i64 [[TMP0]] to ptr
22; CHECK-NEXT:    ret ptr [[TMP1]]
23;
24entry:
25  %0 = inttoptr i128 %x to ptr
26  ret ptr %0
27}
28
29; PR3574
30define i64 @f0(i32 %a0) nounwind {
31; CHECK-LABEL: @f0(
32; CHECK-NEXT:    [[TMP1:%.*]] = zext i32 [[A0:%.*]] to i64
33; CHECK-NEXT:    ret i64 [[TMP1]]
34;
35  %t0 = inttoptr i32 %a0 to ptr
36  %t1 = ptrtoint ptr %t0 to i64
37  ret i64 %t1
38}
39
40define <4 x i32> @test4(<4 x ptr> %arg) nounwind {
41; CHECK-LABEL: @test4(
42; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint <4 x ptr> [[ARG:%.*]] to <4 x i64>
43; CHECK-NEXT:    [[P1:%.*]] = trunc <4 x i64> [[TMP1]] to <4 x i32>
44; CHECK-NEXT:    ret <4 x i32> [[P1]]
45;
46  %p1 = ptrtoint <4 x ptr> %arg to <4 x i32>
47  ret <4 x i32> %p1
48}
49
50define <vscale x 4 x i32> @testvscale4(<vscale x 4 x ptr> %arg) nounwind {
51; CHECK-LABEL: @testvscale4(
52; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint <vscale x 4 x ptr> [[ARG:%.*]] to <vscale x 4 x i64>
53; CHECK-NEXT:    [[P1:%.*]] = trunc <vscale x 4 x i64> [[TMP1]] to <vscale x 4 x i32>
54; CHECK-NEXT:    ret <vscale x 4 x i32> [[P1]]
55;
56  %p1 = ptrtoint <vscale x 4 x ptr> %arg to <vscale x 4 x i32>
57  ret <vscale x 4 x i32> %p1
58}
59
60define <4 x i128> @test5(<4 x ptr> %arg) nounwind {
61; CHECK-LABEL: @test5(
62; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint <4 x ptr> [[ARG:%.*]] to <4 x i64>
63; CHECK-NEXT:    [[P1:%.*]] = zext <4 x i64> [[TMP1]] to <4 x i128>
64; CHECK-NEXT:    ret <4 x i128> [[P1]]
65;
66  %p1 = ptrtoint <4 x ptr> %arg to <4 x i128>
67  ret <4 x i128> %p1
68}
69
70define <4 x ptr> @test6(<4 x i32> %arg) nounwind {
71; CHECK-LABEL: @test6(
72; CHECK-NEXT:    [[TMP1:%.*]] = zext <4 x i32> [[ARG:%.*]] to <4 x i64>
73; CHECK-NEXT:    [[P1:%.*]] = inttoptr <4 x i64> [[TMP1]] to <4 x ptr>
74; CHECK-NEXT:    ret <4 x ptr> [[P1]]
75;
76  %p1 = inttoptr <4 x i32> %arg to <4 x ptr>
77  ret <4 x ptr> %p1
78}
79
80define <4 x ptr> @test7(<4 x i128> %arg) nounwind {
81; CHECK-LABEL: @test7(
82; CHECK-NEXT:    [[TMP1:%.*]] = trunc <4 x i128> [[ARG:%.*]] to <4 x i64>
83; CHECK-NEXT:    [[P1:%.*]] = inttoptr <4 x i64> [[TMP1]] to <4 x ptr>
84; CHECK-NEXT:    ret <4 x ptr> [[P1]]
85;
86  %p1 = inttoptr <4 x i128> %arg to <4 x ptr>
87  ret <4 x ptr> %p1
88}
89