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