154 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5 6; Positive test - all uses are identical casts.7define void @t0(i1 zeroext %c0, i1 zeroext %c1, ptr nocapture readonly %src) {8; CHECK-LABEL: @t0(9; CHECK-NEXT: bb:10; CHECK-NEXT: [[DATA:%.*]] = load i64, ptr [[SRC:%.*]], align 811; CHECK-NEXT: br i1 [[C0:%.*]], label [[BB3:%.*]], label [[BB7:%.*]]12; CHECK: bb3:13; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB4:%.*]], label [[BB5:%.*]]14; CHECK: bb4:15; CHECK-NEXT: tail call void @abort()16; CHECK-NEXT: unreachable17; CHECK: bb5:18; CHECK-NEXT: [[PTR0:%.*]] = inttoptr i64 [[DATA]] to ptr19; CHECK-NEXT: tail call void @sink0(ptr [[PTR0]])20; CHECK-NEXT: br label [[BB9:%.*]]21; CHECK: bb7:22; CHECK-NEXT: [[PTR1:%.*]] = inttoptr i64 [[DATA]] to ptr23; CHECK-NEXT: tail call void @sink1(ptr [[PTR1]])24; CHECK-NEXT: br label [[BB9]]25; CHECK: bb9:26; CHECK-NEXT: ret void27;28bb:29 %data = load i64, ptr %src, align 830 br i1 %c0, label %bb3, label %bb731 32bb3:33 br i1 %c1, label %bb4, label %bb534 35bb4:36 tail call void @abort()37 unreachable38 39bb5:40 %ptr0 = inttoptr i64 %data to ptr41 tail call void @sink0(ptr %ptr0)42 br label %bb943 44bb7:45 %ptr1 = inttoptr i64 %data to ptr46 tail call void @sink1(ptr %ptr1)47 br label %bb948 49bb9:50 ret void51}52 53; Negative test - all uses are casts, but non-identical ones.54define void @n1(i1 zeroext %c0, i1 zeroext %c1, ptr nocapture readonly %src) {55; CHECK-LABEL: @n1(56; CHECK-NEXT: bb:57; CHECK-NEXT: [[DATA:%.*]] = load i64, ptr [[SRC:%.*]], align 858; CHECK-NEXT: br i1 [[C0:%.*]], label [[BB3:%.*]], label [[BB7:%.*]]59; CHECK: bb3:60; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB4:%.*]], label [[BB5:%.*]]61; CHECK: bb4:62; CHECK-NEXT: tail call void @abort()63; CHECK-NEXT: unreachable64; CHECK: bb5:65; CHECK-NEXT: [[PTR0:%.*]] = inttoptr i64 [[DATA]] to ptr66; CHECK-NEXT: tail call void @sink0(ptr [[PTR0]])67; CHECK-NEXT: br label [[BB9:%.*]]68; CHECK: bb7:69; CHECK-NEXT: [[VEC:%.*]] = bitcast i64 [[DATA]] to <2 x i32>70; CHECK-NEXT: tail call void @sink2(<2 x i32> [[VEC]])71; CHECK-NEXT: br label [[BB9]]72; CHECK: bb9:73; CHECK-NEXT: ret void74;75bb:76 %data = load i64, ptr %src, align 877 br i1 %c0, label %bb3, label %bb778 79bb3:80 br i1 %c1, label %bb4, label %bb581 82bb4:83 tail call void @abort()84 unreachable85 86bb5:87 %ptr0 = inttoptr i64 %data to ptr88 tail call void @sink0(ptr %ptr0)89 br label %bb990 91bb7:92 %vec = bitcast i64 %data to <2 x i32> ; different cast93 tail call void @sink2(<2 x i32> %vec)94 br label %bb995 96bb9:97 ret void98}99 100; Negative test - have non-cast users.101define void @n2(i1 zeroext %c0, i1 zeroext %c1, ptr nocapture readonly %src) {102; CHECK-LABEL: @n2(103; CHECK-NEXT: bb:104; CHECK-NEXT: [[DATA:%.*]] = load i64, ptr [[SRC:%.*]], align 8105; CHECK-NEXT: br i1 [[C0:%.*]], label [[BB3:%.*]], label [[BB7:%.*]]106; CHECK: bb3:107; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB4:%.*]], label [[BB5:%.*]]108; CHECK: bb4:109; CHECK-NEXT: tail call void @abort()110; CHECK-NEXT: unreachable111; CHECK: bb5:112; CHECK-NEXT: [[PTR0:%.*]] = inttoptr i64 [[DATA]] to ptr113; CHECK-NEXT: tail call void @sink0(ptr [[PTR0]])114; CHECK-NEXT: br label [[BB9:%.*]]115; CHECK: bb7:116; CHECK-NEXT: tail call void @sink3(i64 [[DATA]])117; CHECK-NEXT: br label [[BB9]]118; CHECK: bb9:119; CHECK-NEXT: ret void120;121bb:122 %data = load i64, ptr %src, align 8123 br i1 %c0, label %bb3, label %bb7124 125bb3:126 br i1 %c1, label %bb4, label %bb5127 128bb4:129 tail call void @abort()130 unreachable131 132bb5:133 %ptr0 = inttoptr i64 %data to ptr134 tail call void @sink0(ptr %ptr0)135 br label %bb9136 137bb7:138 tail call void @sink3(i64 %data) ; non-cast use139 br label %bb9140 141bb9:142 ret void143}144 145declare void @abort()146 147declare void @sink0(ptr)148 149declare void @sink1(ptr)150 151declare void @sink2(<2 x i32>)152 153declare void @sink3(i64)154