1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; This testcase used to hit an assert during ISel. For details, see the big 4*9880d681SAndroid Build Coastguard Worker; comment inside the function. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo: 7*9880d681SAndroid Build Coastguard Worker; The AND should be turned into a subreg access. 8*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and 9*9880d681SAndroid Build Coastguard Worker; The shift (leal) should be folded into the scale of the address in the load. 10*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: leal 11*9880d681SAndroid Build Coastguard Worker; CHECK: movl {{.*}},4), 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128" 14*9880d681SAndroid Build Coastguard Workertarget triple = "i386-apple-macosx10.6.0" 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine void @foo(i32 %a) { 17*9880d681SAndroid Build Coastguard Workerbb: 18*9880d681SAndroid Build Coastguard Worker br label %bb1692 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerbb1692: 21*9880d681SAndroid Build Coastguard Worker %tmp1694 = phi i32 [ 0, %bb ], [ %tmp1745, %bb1692 ] 22*9880d681SAndroid Build Coastguard Worker %xor = xor i32 0, %tmp1694 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; %load1 = (load (and (shl %xor, 2), 1020)) 25*9880d681SAndroid Build Coastguard Worker %tmp1701 = shl i32 %xor, 2 26*9880d681SAndroid Build Coastguard Worker %tmp1702 = and i32 %tmp1701, 1020 27*9880d681SAndroid Build Coastguard Worker %tmp1703 = getelementptr inbounds [1028 x i8], [1028 x i8]* null, i32 0, i32 %tmp1702 28*9880d681SAndroid Build Coastguard Worker %tmp1704 = bitcast i8* %tmp1703 to i32* 29*9880d681SAndroid Build Coastguard Worker %load1 = load i32, i32* %tmp1704, align 4 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; %load2 = (load (shl (and %xor, 255), 2)) 32*9880d681SAndroid Build Coastguard Worker %tmp1698 = and i32 %xor, 255 33*9880d681SAndroid Build Coastguard Worker %tmp1706 = shl i32 %tmp1698, 2 34*9880d681SAndroid Build Coastguard Worker %tmp1707 = getelementptr inbounds [1028 x i8], [1028 x i8]* null, i32 0, i32 %tmp1706 35*9880d681SAndroid Build Coastguard Worker %tmp1708 = bitcast i8* %tmp1707 to i32* 36*9880d681SAndroid Build Coastguard Worker %load2 = load i32, i32* %tmp1708, align 4 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker %tmp1710 = or i32 %load2, %a 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; While matching xor we address-match %load1. The and-of-shift reassocication 41*9880d681SAndroid Build Coastguard Worker; in address matching transform this into into a shift-of-and and the resuting 42*9880d681SAndroid Build Coastguard Worker; node becomes identical to %load2. CSE replaces %load1 which leaves its 43*9880d681SAndroid Build Coastguard Worker; references in MatchScope and RecordedNodes stale. 44*9880d681SAndroid Build Coastguard Worker %tmp1711 = xor i32 %load1, %tmp1710 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker %tmp1744 = getelementptr inbounds [256 x i32], [256 x i32]* null, i32 0, i32 %tmp1711 47*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %tmp1744, align 4 48*9880d681SAndroid Build Coastguard Worker %tmp1745 = add i32 %tmp1694, 1 49*9880d681SAndroid Build Coastguard Worker indirectbr i8* undef, [label %bb1756, label %bb1692] 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerbb1756: 52*9880d681SAndroid Build Coastguard Worker br label %bb2705 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerbb2705: 55*9880d681SAndroid Build Coastguard Worker indirectbr i8* undef, [label %bb5721, label %bb5736] 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerbb5721: 58*9880d681SAndroid Build Coastguard Worker br label %bb2705 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerbb5736: 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63