blob: 7764ca76cc9a3424fd261e744b6a669919688794 [file] [log] [blame]
David Majnemerb5e365c2017-01-04 02:21:37 +00001; 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 }