• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instcombine -S | FileCheck %s
3
4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5target triple = "x86_64-unknown-linux-gnu"
6
7declare i32 @callee()
8
9define i64 @test1(i32 %V) {
10; CHECK-LABEL: @test1(
11; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @callee(), !range !0
12; CHECK-NEXT:    [[CALL2:%.*]] = call i32 @callee(), !range !0
13; CHECK-NEXT:    [[ADDCONV:%.*]] = add nuw nsw i32 [[CALL1]], [[CALL2]]
14; CHECK-NEXT:    [[ADD:%.*]] = zext i32 [[ADD:%.*]]conv to i64
15; CHECK-NEXT:    ret i64 [[ADD]]
16;
17  %call1 = call i32 @callee(), !range !0
18  %call2 = call i32 @callee(), !range !0
19  %zext1 = sext i32 %call1 to i64
20  %zext2 = sext i32 %call2 to i64
21  %add = add i64 %zext1, %zext2
22  ret i64 %add
23}
24
25define i64 @test2(i32 %V) {
26; CHECK-LABEL: @test2(
27; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @callee(), !range !0
28; CHECK-NEXT:    [[CALL2:%.*]] = call i32 @callee(), !range !0
29; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i32 [[CALL1]], [[CALL2]]
30; CHECK-NEXT:    [[ZEXT1:%.*]] = zext i32 [[ADD]] to i64
31; CHECK-NEXT:    ret i64 [[ZEXT1]]
32;
33  %call1 = call i32 @callee(), !range !0
34  %call2 = call i32 @callee(), !range !0
35  %add = add i32 %call1, %call2
36  %zext = sext i32 %add to i64
37  ret i64 %zext
38}
39
40define i64 @test3(i32 %V) {
41; CHECK-LABEL: @test3(
42; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @callee(), !range !0
43; CHECK-NEXT:    [[CALL2:%.*]] = call i32 @callee(), !range !0
44; CHECK-NEXT:    [[MULCONV:%.*]] = mul nuw nsw i32 [[CALL1]], [[CALL2]]
45; CHECK-NEXT:    [[ADD:%.*]] = zext i32 [[MULCONV]] to i64
46; CHECK-NEXT:    ret i64 [[ADD]]
47;
48  %call1 = call i32 @callee(), !range !0
49  %call2 = call i32 @callee(), !range !0
50  %zext1 = sext i32 %call1 to i64
51  %zext2 = sext i32 %call2 to i64
52  %add = mul i64 %zext1, %zext2
53  ret i64 %add
54}
55
56define i64 @test4(i32 %V) {
57; CHECK-LABEL: @test4(
58; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @callee(), !range !0
59; CHECK-NEXT:    [[CALL2:%.*]] = call i32 @callee(), !range !0
60; CHECK-NEXT:    [[ADD:%.*]] = mul nuw nsw i32 [[CALL1]], [[CALL2]]
61; CHECK-NEXT:    [[ZEXT1:%.*]] = zext i32 [[ADD]] to i64
62; CHECK-NEXT:    ret i64 [[ZEXT1]]
63;
64  %call1 = call i32 @callee(), !range !0
65  %call2 = call i32 @callee(), !range !0
66  %add = mul i32 %call1, %call2
67  %zext = sext i32 %add to i64
68  ret i64 %zext
69}
70
71!0 = !{ i32 0, i32 2000 }
72